两个图像与alpha“正常”混合的问题

时间:2010-10-04 19:12:07

标签: java android image-processing

我正在尝试用Java混合图像。在完成多次和屏幕混合后,“正常”混合让我感到头痛。

我在维基百科上发现用alpha混合两个像素的公式是: Co是最终颜色,顶部图像的Ca颜色,底部图像的Cb颜色和Aa - >。顶部的α,Ab - >底部的阿尔法。

我试图将其转换为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                     
);

但这似乎是错误的,因为产生的图像出错了。

在将公式转换为代码时,我缺少什么想法,或者我是否缺乏数学技能让我再次受益?

2 个答案:

答案 0 :(得分:1)

你需要改变很多这个。

t_r,t_a等必须全部浮点数从0到1.以浮点计算所有计算,然后乘以255然后转换为int。

答案 1 :(得分:0)

如果t_a不是浮点值,那么诸如(255-t_a)/ 255之类的计算也将作为整数完成。您需要预先将其中一个输入转换为浮点数,例如((255 - t_a)/ 255f)。