Dee*_*eeV 1 android android-image bitmapfactory
我正在写一个自定义类.在实际绘制之前,需要为某些预处理和大小调整计算位图.位图本身是预处理的9补丁图像.在构造函数中,有以下代码:
BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
bmpOptions.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), BITMAP_ID, bmpOptions);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), BITMAP_ID);
Log.d(getClass().getSimpleName(), "width: " + bmp.getWidth() + " " + bmpOptions.outWidth + "; height: " + bmp.getHeight() + " " + bmpOptions.outHeight);
Run Code Online (Sandbox Code Playgroud)
运行Android 3.2.2的7"三星Galaxy Tab 7上的输出:
宽度:556 556; 身高:890 890
运行Android 4.1的10"Motorola Xoom上的输出:
宽度:556 556; 身高:890 890
运行Android 4.2.2的7"Nexus 7上的输出:
宽度:740 834; 高度; 1185 1335
位图的实际尺寸为:
mdpi:558 x 892
hdpi:836 x 1337
位图是预处理的9补丁,这就是尺寸偏离2个像素的原因.我无法理解为什么Nexus 7上的hdpi资产会产生很大的影响.
我也试过这些配置:
bmpOptions.inScaled = false;
Run Code Online (Sandbox Code Playgroud)
和
bmpOptions.inTargetDensity = getResources().getDisplayMetrics().densityDpi;
Run Code Online (Sandbox Code Playgroud)
和
bmpOptions.inTargetDensity = getResources().getDisplayMetrics().densityDpi;
bmpOptions.inDensity = getResources().getDisplayMetrics().densityDpi;
Run Code Online (Sandbox Code Playgroud)
和
bmpOptions.inTargetDensity = 0;
bmpOptions.inDensity = 0;
Run Code Online (Sandbox Code Playgroud)
我也尝试了相反的方法,并为解码的位图创建第二个BitmapFactory.Options,并告诉它根本不进行缩放.
所有这些都提供了完全相同的结果.
要使用inJustDecodeBounds选项获取实际图像大小,您需要将返回的outWidth和outHeight乘以比例系数,该系数等于inTargetDensity/inDensity.示例代码是:
public static void getBitmapDims(Resources res, int resId, Holder<Integer> width, Holder<Integer> height)
{
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, opts);
float scale = (float) opts.inTargetDensity / opts.inDensity;
width.value = (int) (opts.outWidth * scale + 0.5f);
height.value = (int) (opts.outHeight * scale + 0.5f);
}
Run Code Online (Sandbox Code Playgroud)