You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:36:03