相关主题(尚未提供解决方案):Access to raw data in ARGB_8888 Android Bitmap
简而言之:使用copyPixelFromBuffer
和copyPixelsToBuffer
时,Android已经在RGB频道上应用了Alpha通道。
我需要将其转换为原始ARGB值,反之亦然。我不知道Android如何应用它。你能告诉我这个公式吗?
答案 0 :(得分:1)
Android以alpha预乘形式存储位图数据。换句话说,复制数据时不应用alpha值,它一直在应用。
要转换为预乘形式,请将颜色分量与规范化的alpha值相乘,如下所示:
redPremultiplied = red * normalizedAlpha
greenPremultiplied = green * normalizedAlpha
bluePremultiplied = blue * normalizedAlpha
alphaPremultiplied = alpha
,其中
red = <value between 0 and 255>
green = <value between 0 and 255>
blue = <value between 0 and 255>
alpha = <value between 0 and 255>
normalizedAlpha = alpha / 255
要从预乘alpha转换为规范形式,请将预乘组件与规范化alpha分开:
red = redPremultiplied / normalizedAlpha
green = greenPremultiplied / normalizedAlpha
blue = bluePremultiplied / normalizedAlpha
alpha = alphaPremultiplied
但一定要注意normalizedAlpha = 0!您应该注意,理论上Bitmap.copyPixelsToBuffer()
和Bitmap.copyPixelsFromBuffer()
处理的数据可以采用任何格式。使用Bitmap.getPixels()
和Bitmap.setPixels()
更安全,因为API可以保证这些函数处理的数据格式。特别是,您不必担心预乘和非预乘alpha,因为这些函数会为您处理。