使用BitmapFactory.decodeResource()重新采样PNG后出现意外的位图大小

时间:2017-03-31 10:23:58

标签: android bitmap

我的PNG文件位于res/drawable文件夹中。它的大小是2524 * 2524。

在将其加载到ImageView之前,我想根据ImageView的尺寸调整它的大小。所以我编写了以下实用程序代码来将PNG的大小调整为Bitmap。 (来自https://developer.android.com/topic/performance/graphics/load-bitmap.html

)的轻微修改版本

public static Bitmap decodeSampledBitmapFromResource(
        Resources res, int resId, int targetWidth, int targetHeight) {

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    options.inSampleSize = calculateInSampleSize(options, targetWidth, targetHeight);
    options.inJustDecodeBounds = false;
    Bitmap result = BitmapFactory.decodeResource(res, resId, options);

    Log.d(TAG, "Result bitmap size: " + result.getWidth() + "*" + result.getHeight());
    return result;
}

private static int calculateInSampleSize(
        BitmapFactory.Options options, int targetWidth, int targetHeight) {

    Log.d(TAG, "Target bitmap size: " + targetWidth + "*" + targetHeight);
    int width = options.outWidth;
    int height = options.outHeight;
    Log.d(TAG, "Source bitmap size: " + width + "*" + height);

    int inSampleSize = 1;
    while ((width /= 2) >= targetWidth &&
            (height /= 2) >= targetHeight) {
        inSampleSize *= 2;
    }

    Log.d(TAG, "inSampleSize: " + inSampleSize);
    return inSampleSize;
}

在我的情况下,源PNG图像 2524 * 2524 ImageView 500 * 500 像素大小。所以我希望inSampleSize的值为 4 ,并且重新采样的位图的大小为 631 * 631 (2524/4) * 2524/4)。

但是,日志提供了以下信息:

D/ImageResizer: Target bitmap size: 500*500
D/ImageResizer: Source bitmap size: 2524*2524
D/ImageResizer: inSampleSize: 4
D/ImageResizer: Result bitmap size: 1656*1656

inSampleSize的值是正确的。但结果位图大小不是我所期待的。 2524甚至不能被1656整除。为什么会这样?

1 个答案:

答案 0 :(得分:1)

从资源解码将保留适应图像文件到gui维度。

最好将文件放在资产目录中。

并使用资产管理器和decodeFromStream()。