使用copyPixelsToBuffer时Android如何应用alpha通道?

时间:2012-09-07 00:57:00

标签: java android algorithm colors buffer

相关主题(尚未提供解决方案):Access to raw data in ARGB_8888 Android Bitmap

简而言之:使用copyPixelFromBuffercopyPixelsToBuffer时,Android已经在RGB频道上应用了Alpha通道。

我需要将其转换为原始ARGB值,反之亦然。我不知道Android如何应用它。你能告诉我这个公式吗?

1 个答案:

答案 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,因为这些函数会为您处理。