首页 > 解决方案 > 如何在android上正确灰度位图以使文件更轻

问题描述

我试图充分利用压缩,我需要使图像灰度化以使文件更轻。我找到了一个使图像灰度化的函数:

fun toGrayscale(bmpOriginal: Bitmap): Bitmap {
        val width = bmpOriginal.width
        val height = bmpOriginal.height

        val bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
        val c = Canvas(bmpGrayscale)
        val paint = Paint()
        val cm = ColorMatrix()
        cm.setSaturation(0f)
        val f = ColorMatrixColorFilter(cm)
        paint.colorFilter = f
        c.drawBitmap(bmpOriginal, 0f, 0f, paint)
        return bmpGrayscale
}

然后我保存它

try {
    FileOutputStream(filePathGrayScale).use { out ->
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, out)
    }
} catch (e: IOException) {
    e.printStackTrace()
}

但是图像尺寸增加了!

我到底做错了什么以及如何使事情正确?

标签: androidkotlinbitmap

解决方案


bmp.compress(Bitmap.CompressFormat.JPEG, 100, out)

您正在以 100 的压缩质量保存图像。这会最大化文件大小(并最小化质量损失)。

如果您想充分利用压缩,请在此处传递较低的值。没有理想值,因为它实际上取决于被压缩的图像和可容忍的伪影数量。这是文件大小和图像质量之间的权衡。

有关质量级别的更多信息,请参阅:
转换为 JPG 时选择什么质量?
还有一些例子1 , 2


推荐阅读