を使用してSDカードからビットマップをデコードしBitmapFactory.decodeFile
ます。ビットマップがアプリケーションが必要とするものやヒープが許可するものよりも大きい場合があるためBitmapFactory.Options.inSampleSize
、サブサンプリングされた(小さい)ビットマップを要求するために使用します。
問題は、プラットフォームがinSampleSizeの正確な値を強制しないことであり、ビットマップが小さすぎるか、使用可能なメモリに対して大きすぎる場合があります。
http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSizeから:
注:デコーダーはこの要求を実行しようとしますが、結果のビットマップは、要求されたものと正確に異なる次元を持つ場合があります。また、2の累乗は、多くの場合、デコーダーが尊重する方が高速で簡単です。
SDカードからビットマップをデコードして、デコードに必要なメモリをできるだけ少なくしながら、必要な正確なサイズのビットマップを取得するにはどうすればよいですか?
編集:
現在のソースコード:
BitmapFactory.Options bounds = new BitmapFactory.Options();
this.bounds.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, bounds);
if (bounds.outWidth == -1) { // TODO: Error }
int width = bounds.outWidth;
int height = bounds.outHeight;
boolean withinBounds = width <= maxWidth && height <= maxHeight;
if (!withinBounds) {
int newWidth = calculateNewWidth(int width, int height);
float sampleSizeF = (float) width / (float) newWidth;
int sampleSize = Math.round(sampleSizeF);
BitmapFactory.Options resample = new BitmapFactory.Options();
resample.inSampleSize = sampleSize;
bitmap = BitmapFactory.decodeFile(filePath, resample);
}