我在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()。