Mobile Dev/Android2011. 8. 12. 01:09
내/외장에 저장 된 이미지 파일(PNG or JPEG ...)을 Bitmap으로 읽어 들이는 간단한 코드이다.
이미지 파일을 읽을 때 너무 큰 이미지는 OutOfMemory가 발생한다. 그래서 폰의 화면 해상도에 가장 근접하게 리스케일을 하여 읽어들이게 했다.
코드는 아주 간단하다.

/**

  * 지정한 패스의 파일을 읽어서 Bitmap 리턴 (화면사이즈에 최다한 맞춰서 리스케일한다.)

  *

  * @param context

  *            application context

  * @param imgFilePath

  *            bitmap file path

  * @return Bitmap

  * @throws IOException

  */

public static Bitmap loadBackgroundBitmap(Context context,

        String imgFilePath) throws Exception, OutOfMemoryError { 

    if (!FileUtil.exists(imgFilePath)) {

        throw new FileNotFoundException("background-image file not found : " + imgFilePath);

    }


    // 폰의 화면 사이즈를 구한다.
    Display display = ((WindowManager) context

            .getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

    int displayWidth = display.getWidth();

    int displayHeight = display.getHeight();

 

    // 읽어들일 이미지의 사이즈를 구한다.

    BitmapFactory.Options options = new BitmapFactory.Options();

    options.inPreferredConfig = Config.RGB_565;

    options.inJustDecodeBounds = true;

    BitmapFactory.decodeFile(imgFilePath, options);

 
    // 화면 사이즈에 가장 근접하는 이미지의 리스케일 사이즈를 구한다.
    // 리스케일의 사이즈는 짝수로 지정한다. (이미지 손실을 최소화하기 위함.) 

    float widthScale = options.outWidth / displayWidth;

    float heightScale = options.outHeight / displayHeight;

    float scale = widthScale > heightScale ? widthScale : heightScale;

            

    if(scale >= 8) {

        options.inSampleSize = 8;

    } else if(scale >= 6) {

        options.inSampleSize = 6;

    } else if(scale >= 4) {

        options.inSampleSize = 4;

    } else if(scale >= 2) {

        options.inSampleSize = 2;

    } else {

        options.inSampleSize = 1;

    }

    options.inJustDecodeBounds = false;

 

    return BitmapFactory.decodeFile(imgFilePath, options);

}

Posted by as.wind.914