我在res/drawable文件夹中有一个PNG文件。尺寸为2524 * 2524。

在将其加载到ImageView之前,我想根据ImageView的尺寸调整其大小。因此,我编写了以下实用程序代码,将PNG的大小调整为。 (来自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,而Bitmap的像素大小为500 * 500。因此,我期望ImageView的值为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整除。为什么呢?

最佳答案

从资源解码将未经请求将图像文件调整为gui尺寸。

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

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

07-27 17:42