Bitmap.createScaledBitmap调用后无法将图片放大至原尺寸两倍
问题原因分析
- 代码逻辑误用:生成了缩放后的
resized_captured_image_bm,但实际渲染到控件、保存到文件时用的仍是原图ogBitmap,是最常见的错误原因。 - 显示控件约束:承载图片的ImageView布局参数限制了显示尺寸,比如宽高设为固定值、父布局有最大尺寸限制,就算Bitmap本身放大,控件也无法完整展示更大的尺寸,视觉上和原图大小一致。
- 系统Density适配抵消:Android会根据设备屏幕密度自动缩放Bitmap资源,若原图的density属性和当前设备density不匹配,手动缩放的效果会被系统自动适配逻辑抵消,最终显示尺寸和原图一致。
解决方案
- 确认使用缩放后的Bitmap
所有需要用到放大后图片的逻辑,都替换为resized_captured_image_bm,比如给ImageView设置图片的代码应为:
imageView.setImageBitmap(resized_captured_image_bm);
不要误用原Bitmap对象。
- 调整ImageView显示参数
如果是控件显示限制导致的问题,修改ImageView的缩放模式为不拉伸Bitmap的模式,同时设置宽高为自适应:
// 按Bitmap原始像素尺寸显示,不做额外缩放 imageView.setScaleType(ImageView.ScaleType.CENTER); // 布局中对应修改宽高属性为wrap_content // android:layout_width="wrap_content" // android:layout_height="wrap_content"
如果有明确的尺寸要求,也可以直接把ImageView的宽高设置为放大后的实际像素值即可。
- 关闭系统自动缩放适配
创建缩放Bitmap前后手动对齐density,避免系统自动缩放抵消手动修改的尺寸:
// 对齐原Bitmap和设备的density ogBitmap.setDensity(getResources().getDisplayMetrics().densityDpi); Bitmap resized_captured_image_bm = Bitmap.createScaledBitmap(ogBitmap,(int)(ogBitmap.getWidth() * 2), (int)(ogBitmap.getHeight() * 2), true); // filter设为true放大后更平滑 // 对齐新Bitmap和设备的density resized_captured_image_bm.setDensity(getResources().getDisplayMetrics().densityDpi);
- 日志校验Bitmap尺寸
如果仍有问题,打印日志确认Bitmap的实际尺寸,定位问题环节:
Log.d("BITMAP_CHECK", "原尺寸:" + ogBitmap.getWidth() + "*" + ogBitmap.getHeight()); Log.d("BITMAP_CHECK", "缩放后尺寸:" + resized_captured_image_bm.getWidth() + "*" + resized_captured_image_bm.getHeight());
如果日志显示缩放后尺寸符合预期,说明问题出在显示环节,优先排查ImageView的相关配置即可。
内容的提问来源于stack exchange,提问作者stackved12
相关产品推荐
相关产品推荐

