我的/res/drawable/
目录中有一张120x120px的图像。这是所有设备所需的大小。
要加载此位图,我使用以下内容:
Bitmap tmpBmp = BitmapFactory.decodeResource(getResources(), R.drawable.myimage);
问题在于,当我衡量tmpBmp
时,尺寸为360x360px。我知道如何将其缩小到我需要的120x120,但这是浪费处理时间,尽管很少。
我假设这与屏幕密度有关,因为我的资源位于无密度目录中。
decodeResource
缩放图片的原因是什么?我该如何阻止它这样做呢?
答案 0 :(得分:14)
默认的drawable
目录假定图像需要从默认的mdpi
大小进行缩放。如果要禁用资源缩放,请将图像放在drawable-nodpi
中。
请注意,与mdpi设备相比,xxhdpi设备上的120x120px图像(如果显示在屏幕上)将小3倍(因为每英寸像素数是原来的三倍)。
答案 1 :(得分:2)
这是因为您的屏幕密度和图像不同。然后,如果您未指定Options
系统将为您执行此操作。在BitmapFactory
的来源,您可以看到:
public static Bitmap decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, Options opts) {
if (opts == null) {
opts = new Options();
}
if (opts.inDensity == 0 && value != null) {
final int density = value.density;
if (density == TypedValue.DENSITY_DEFAULT) {
opts.inDensity = DisplayMetrics.DENSITY_DEFAULT;
} else if (density != TypedValue.DENSITY_NONE) {
opts.inDensity = density;
}
}
if (opts.inTargetDensity == 0 && res != null) {
opts.inTargetDensity = res.getDisplayMetrics().densityDpi;
}
return decodeStream(is, pad, opts);
}
因此,为防止缩放,您需要使用Options
参数指定inScaled=false
参数。或者将图像放到res/drawable-nodpi
文件夹中。