Android平台Bitmap执行反色操作后尺寸变化被裁剪问题求助
问题根因
你遇到的裁剪问题核心是Bitmap密度匹配不一致:
- 你通过
Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)创建的新Bitmap,默认会继承当前设备屏幕的密度参数 - 待反色的原Bitmap如果是从资源加载、或者来自其他途径,密度参数和新Bitmap不一致时,
Canvas.drawBitmap会自动对原Bitmap做缩放适配,导致绘制内容尺寸超出新Bitmap范围,出现裁剪。你遇到的50%裁剪情况,大概率是原Bitmap和新Bitmap的密度参数刚好差2倍导致的。
修复后代码
private fun Bitmap.invertColors(): Bitmap { // 核心修复:新Bitmap复用原Bitmap的密度参数,避免触发自动缩放 val targetBitmap = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888 ).apply { density = this@invertColors.density } val matrixInvert = ColorMatrix().apply { set( floatArrayOf( -1.0f, 0.0f, 0.0f, 0.0f, 255.0f, 0.0f, -1.0f, 0.0f, 0.0f, 255.0f, 0.0f, 0.0f, -1.0f, 0.0f, 255.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f ) ) } val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG).apply { colorFilter = ColorMatrixColorFilter(matrixInvert) } Canvas(targetBitmap).drawBitmap(this, 0f, 0f, paint) return targetBitmap }
补充排查点
如果修改后仍存在裁剪问题,可逐一验证以下配置:
- 调用反色方法前确认原Bitmap的宽高符合预期,避免原Bitmap本身已经被压缩裁剪
- 反色后的Bitmap设置到ImageView时,确认
scaleType属性不是centerCrop等会裁剪内容的配置,也可以先根据ImageView尺寸对原Bitmap做等比缩放后再调用反色方法 - 加载原Bitmap时如果是从资源文件读取,可以给
BitmapFactory.Options设置inScaled = false,禁用系统默认预缩放逻辑
内容的提问来源于stack exchange,提问作者exactly
相关产品推荐
相关产品推荐

