我的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整除。为什么会这样?
答案 0 :(得分:1)
从资源解码将保留适应图像文件到gui维度。
最好将文件放在资产目录中。
并使用资产管理器和decodeFromStream()。