我試圖在Java中做一些圖像混合。在成功完成乘法和屏幕混合後,「正常」混合使我頭痛。兩個圖像與alpha「正常」混合的問題
我在維基百科發現,對於具有alpha混合兩個像素的公式爲: 鈷是得到的彩色,頂部圖像的鈣色,底圖像和AA的Cb彩色 - >頂部的α,抗體 - >底部的阿爾法。
我試過這個翻譯到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中。 – Ishtar 2010-10-04 19:30:57
他們是整數。 – TuomasR 2010-10-04 19:37:01
你可以讓JRE爲你做好工作。只要將一個圖像混合在另一個圖像上,一個簡單的Graphics.drawImage()就可以實現 - 只要圖像是支持alpha的圖像(例如BufferedImage.TYPE_INT_ARGB)。還要看看Graphics2D.setComposite()和AlphaComposite.getInstance(),大部分內容已經存在,並且可能會硬件加速。 – Durandal 2010-10-04 19:45:40