이미지 파일을 읽을 때 너무 큰 이미지는 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);
}
// 폰의 화면 사이즈를 구한다.
.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);
}