我使用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);
}