【发布时间】: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不是整数为零吗?)我想念一些& 0xff?不是专家,但也许你可以尝试 3 个整数,检查它们,然后将它们合并到 dest。 -
您可以让 JRE 为您完成工作。对于只是将一个图像混合在另一个之上,一个简单的 Graphics.drawImage() 就可以做到这一点 - 只要图像是一种支持 alpha 的图像(例如 BufferedImage.TYPE_INT_ARGB)。还可以看看 Graphics2D.setComposite() 和 AlphaComposite.getInstance(),大部分东西都已经存在,而且它可能会被硬件加速。
-
@Durandal:我的目标平台不提供 java.awt。 (我将编辑标签,因为这在问题中并不明显)。
标签: java android image-processing