Android BitmapFactory 从 ARGB png 修剪颜色值

Android BitmapFactory trimming color values from ARGB png

我有一张包含 alpha 值的图像。一些像素的透明度为 0,这意味着它们是完全透明的,其他像素的透明度介于 0 到 255 之间。 尽管像素透明度为 0,但它仍然包含我想使用 bitmap.getPixel(x, y) 方法访问的有效 RGB 值。

问题: 加载的位图丢失所有 RGB 值(它们设置为 0),其中 alpha (A) 值为 0。

这是我加载位图的方式:

val options = BitmapFactory.Options().apply {
    inPreferredConfig = Bitmap.Config.ARGB_8888
}
originalImage = BitmapFactory.decodeResource(context.resources, R.drawable.img, options)
originalImage.setHasAlpha(true)

如果我在 Gimp 等程序中打开同一张图像,并在同一个像素上使用颜色选择器,即使在那些 alpha 为 0 的像素中,我也会获得所有有效的 RGB 值。

只有透明度为 0 的像素会受到影响,其他像素会保留其 RGB 值。

可能是什么原因造成的,如何解决?

由于Android系统内部默认将位图图像处理为预乘位图,所有像素(以非预乘格式存储在文件中)在解码时都转换为预乘像素。因此,RGB 值变为 0,其中 A 为 0。如果您想以非预乘格式保留位图,只需指定 BitmapFactory.Options.inPremultiplied=false.

val options = BitmapFactory.Options().apply {
    inPreferredConfig = Bitmap.Config.ARGB_8888
    inPremultiplied = false
}

originalImage = BitmapFactory.decodeResource(context.resources, R.drawable.img, options)
originalImage.setHasAlpha(true)