【问题标题】:Problems with "normal" blending of two images with alpha两个图像与 alpha 的“正常”混合问题
【发布时间】:2010-10-04 19:12:07
【问题描述】:

我正在尝试在 Java 中进行一些图像混合。在成功进行乘法和屏幕混合后,“正常”混合让我头疼。

我在 Wikipedia 上发现将两个像素与 alpha 混合的公式是: Co 是结果颜色,顶部图像的 Ca 颜色,底部图像的 Cb 颜色和 Aa -> 顶部的 alpha,Ab -> 底部的 alpha。

我尝试将其翻译成 Java,现在有了:

(t_X == 来自顶部图像的组件,b_X == 来自底部图像的组件)

float t_a = (topPixels[i] >> 24) & 0xff, t_r = (topPixels[i] >> 16) & 0xff, t_g = (topPixels[i] >> 8) & 0xff, t_b = topPixels[i] & 0xff;
float b_a = (bottomPixels[i] >> 24) & 0xff, b_r = (bottomPixels[i] >> 16) & 0xff, b_g = (bottomPixels[i] >> 8) & 0xff, b_b = bottomPixels[i] & 0xff;

destPixels[i] = 
    (255 << 24 |
    (int)((t_r * t_a) + ((b_r * b_a) * (((255 - t_a) / 255)))) << 16 |  
    (int)((t_g * t_a) + ((b_g * b_a) * (((255 - t_a) / 255)))) << 8 |   
    (int)((t_b * t_a) + ((b_b * b_a) * (((255 - t_a) / 255)))) << 0                     
);

但这似乎是错误的,因为生成的图像是错误的。

在将公式转换为代码时,有什么想法是我遗漏的,还是我缺乏数学技能再次占了上风?

【问题讨论】:

  • t_r, t_a 是浮点数、整数 (0-255) 还是...?数学看起来不错,但所有的演员表看起来都很奇怪((255 - t_a) / 255 不是整数为零吗?)我想念一些&amp; 0xff?不是专家,但也许你可以尝试 3 个整数,检查它们,然后将它们合并到 dest。
  • 您可以让 JRE 为您完成工作。对于只是将一个图像混合在另一个之上,一个简单的 Graphics.drawImage() 就可以做到这一点 - 只要图像是一种支持 alpha 的图像(例如 BufferedImage.TYPE_INT_ARGB)。还可以看看 Graphics2D.setComposite() 和 AlphaComposite.getInstance(),大部分东西都已经存在,而且它可能会被硬件加速。
  • @Durandal:我的目标平台不提供 java.awt。 (我将编辑标签,因为这在问题中并不明显)。

标签: java android image-processing


【解决方案1】:

你需要改变很多。

t_r、t_a 等都必须是从 0 到 1 的浮点数。用浮点数进行所有计算,然后乘以 255,然后转换为 int。

【讨论】:

  • 做到了,没有帮助。图像仍然出现错误。代码在这里:pastebin.com/9YVU53nU
  • 啊,我一开始用 255 少了一个除法,现在可以了,谢谢。
【解决方案2】:

如果 t_a 不是浮点值,则 (255 - t_a) / 255 等计算也以整数形式进行。您需要事先将其中一个输入转换为浮点数,例如 ((255 - t_a) / 255f)。

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 2021-02-28
    • 2013-09-14
    • 2015-11-04
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多