2010-10-04 59 views
1

我試圖在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      
); 

但這似乎是錯誤的,因爲最終的圖像出錯了。

任何想法,我失蹤,或者是我缺乏數學技能再次將公式翻譯成代碼時獲得最好的結果?

+0

t_r,t_a是浮點數,整數(0-255)或...?數學看起來不錯,但所有的演員看起來都很怪異('(255 - t_a)/ 255'對於整數不是零)?我想念一些'&0xff'?沒有專家,但也許你可以嘗試3個整數,檢查它們,然後將它們結合在dest中。 – Ishtar 2010-10-04 19:30:57

+0

他們是整數。 – TuomasR 2010-10-04 19:37:01

+0

你可以讓JRE爲你做好工作。只要將一個圖像混合在另一個圖像上,一個簡單的Graphics.drawImage()就可以實現 - 只要圖像是支持alpha的圖像(例如BufferedImage.TYPE_INT_ARGB)。還要看看Graphics2D.setComposite()和AlphaComposite.getInstance(),大部分內容已經存在,並且可能會硬件加速。 – Durandal 2010-10-04 19:45:40

回答

1

你需要改變很多。

t_r,t_a等必須都是從0到1的浮點數。以浮點數執行所有計算,然後乘以255,然後轉換爲int。

+0

沒有,沒有幫助。圖像仍然出錯。代碼在這裏:http://pastebin.com/9YVU53nU – TuomasR 2010-10-04 20:05:53

+0

啊,我在開始時錯過了一個255的分區,現在它的工作,謝謝。 – TuomasR 2010-10-04 20:20:05

0

如果t_a不是浮點值,那麼諸如(255-t_a)/ 255之類的計算也會以整數形式完成。您需要事先將其中一個輸入投射到浮點數,例如((255 - t_a)/ 255f)。

+0

我嘗試過,但不幸沒有幫助。 – TuomasR 2010-10-04 19:38:29