部分安卓机型调用Bitmap.createScaledBitmap缩放Bitmap尺寸异常
问题根因与解决方案
1. Bitmap 自带 density 属性导致隐式缩放
- 从资源目录加载的 Bitmap 会自带当前设备的 density 标记,
createScaledBitmap生成的新 Bitmap 会继承该属性,后续绘制时如果画布的 density 配置和 Bitmap 不匹配,就会触发自动缩放,导致视觉上尺寸大于预期。 - 修复方案:缩放前后强制重置 Bitmap 的 density 属性,禁用系统自动适配逻辑:
// 重置原Bitmap的density bitmap.setDensity(Bitmap.DENSITY_NONE); Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 50, 50, true); // 重置生成的缩放Bitmap的density scaledBitmap.setDensity(Bitmap.DENSITY_NONE);
2. 游戏页面绘制容器的缩放配置异常
- 游戏页面通常使用 SurfaceView/TextureView 类渲染容器,这类容器默认可能开启了全局 density 适配,你绘制的 50x50 对比矩形实际是按逻辑 dp 单位计算,和 Bitmap 的实际像素尺寸形成视觉差。
- 修复方案:绘制前统一画布的密度配置:
// 禁用Canvas的自动密度缩放 canvas.setDensity(Bitmap.DENSITY_NONE); // 按实际像素绘制对比矩形和Bitmap canvas.drawRect(0, 0, 50, 50, paint); canvas.drawBitmap(scaledBitmap, 0, 0, paint);
3. 三星系统Bitmap缩放优化导致的异常
- 部分三星定制ROM对缩小比例超过阈值的Bitmap会触发内置采样优化,跳过部分缩小逻辑导致最终尺寸偏大,仅在小尺寸缩放场景下复现。
- 修复方案:用Matrix缩放逻辑替代系统
createScaledBitmap方法:
Matrix matrix = new Matrix(); matrix.postScale(50f / bitmap.getWidth(), 50f / bitmap.getHeight()); Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
验证步骤
先在故障设备打印缩放前后的Bitmap宽高,确认缩放逻辑本身是否正常:Log.d("DEBUG", "缩放后尺寸:" + scaledBitmap.getWidth() + "x" + scaledBitmap.getHeight());
如果输出为50x50,说明问题出在绘制阶段的缩放配置,优先排查第二类问题。
内容的提问来源于stack exchange,提问作者ItsAMe
相关产品推荐
相关产品推荐

