【问题标题】:How does Android apply alpha channel when using copyPixelsToBuffer?Android 在使用 copyPixelsToBuffer 时如何应用 alpha 通道?
【发布时间】:2012-08-31 21:10:48
【问题描述】:

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

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

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

【问题讨论】:

    标签: java android algorithm colors buffer


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

    【讨论】:

    • 不使用getPixel()setPixel() 的目的是访问大量像素,因此使用缓冲区具有更好的性能。我会测试你的公式,稍后再告诉你结果。谢谢。
    猜你喜欢
    • 2023-04-03
    • 2019-03-27
    • 1970-01-01
    • 2012-11-17
    • 2016-05-09
    • 1970-01-01
    • 2011-02-04
    • 2011-01-21
    • 1970-01-01
    相关资源
    最近更新 更多