2015-11-07 80 views
1

我如何將2個複合材料合併爲一個?讓我來解釋:結合多重graphics2d複合材料?

BufferedImage copy = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB); 
Graphics2D g2d = copy.createGraphics(); 
g2d.setComposite(AlphaComposite.Clear); 
g2d.fillRect(0, 0, img.getWidth(), img.getHeight()); 

現在我們有一個透明的形象。

g2d.setComposite(AlphaComposite.Src); 
g2d.drawImage(img, 0, 0, null); 

現在我們有一個包含透明區域的「img」的精確副本。

g2d.setComposite(BlendComposite.getInstance(BlendingMode.MULTIPLY)); 
g2d.setColor(overlayColor); 
g2d.fillRect(0, 0, img.getWidth(), img.getHeight()); 

(BlendComposite從http://www.curious-creature.com/2006/09/20/new-blendings-modes-for-java2d/) 此時乘法複合給該圖像的漂亮的顏色(overlayColor)。

但透明區域現在具有與overlayColor相同的顏色。

如何防止透明區域獲取overlayColor?

+1

我懷疑你不能。但是你可以通過使用我猜想的步驟從原始「恢復」alpha來解決它。 – haraldK

+0

@haraldK,最大的問題是如何? ;-)如果我知道或已經找到辦法做到這一點,我會很高興。 –

+1

用'DstIn'' AlphaComposite'在'copy'(使用現有的'g2d')上繪製原始('img')? – haraldK

回答

0

@haraldK指向我一個很好的有效的解決方案:

與 DstIn的AlphaComposite漆原(IMG)在副本(使用現有G2D)?

我給它一個嘗試只是乘法步驟之後:

g2d.setComposite(AlphaComposite.DstIn); 
g2d.drawImage(img, 0, 0, null); 

它現在的作品,我有我的透明度回來了!

對於任何具有同樣的問題:

AlphaComposite.DstIn:

如果在源和目的地的重疊像素,從所述源與alpha在重疊區域應用到目標像素。如果alpha = 1.0,則重疊區域中的像素不變;如果alpha爲0.0,則重疊區域中的像素將被清除。

http://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html