2012-11-16 142 views
3

我正在尋找一種方法來繪製一個帶有灰度顏色的Java中的PNG圖像(帶有Alpha通道),然後覆蓋一個透明顏色,例如Green 75%的不透明度,最重要的是改變顏色。 要清楚,最終的圖像將直接導致在其上方放置透明顏色,並且不會是任何特殊類型混合的結果。上的圖像的頂部在Alpha通道上疊加一個透明顏色的PNG

然後疊加RGB顏色(102,255,0,阿爾法)::

例如,我會得出以下圖像

在圖像上繪製顏色的方法必須是這樣的,它不會干擾屏幕上靠近的其他圖像。這將與Adobe Photoshop的顏色疊加功能類似。兩幅圖像可以有不同的顏色疊加層,但單獨的疊加層不會與彼此相沖突。

感謝leonbloy,我相信使用「SRC_OVER」的AlphaComposit可以解決這個問題,然後我可以使用一種方法將結果保存爲一個新的BufferedImage,這將防止疊加層影響屏幕上的任何其他圖像對象。

我會發布結果,因爲我測試這個。

+0

不清楚你想要做什麼,也沒有嘗試過什麼。你在使用BufferedImage嗎?你讀過 - 是 - [這](http://stackoverflow.com/questions/2318020/merging-two-images)?你想根據頂部圖像的透明度來做一個「正常」的覆蓋,或者你是想實現一個特殊的混合/覆蓋?你看過[AlphaComposite](http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/AlphaComposite.html)嗎? – leonbloy

+1

我的歉意,我會盡量更清楚。我的意圖是按照透明度進行正常疊加。我不以任何方式混合。我並不知道AlphaComposite類,因爲我是Java中2D圖形編程的新手,在我的初始搜索中沒有找到。我查看了AlphaComposite上的[this](http://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html)頁面,看起來好像「SOURCE_OVER」是我正在使用的。 – ubertastic

+1

好的,如果你解決了你的問題,你總是可以自己添加你的解決方案作爲答案並接受它。順便說一句,這與PNG沒有特別的關係,我刪除了這個標籤。 – leonbloy

回答

5

我能夠使用AlphaComposite,Graphics2D和BufferedImage獲得所需的效果。

@Override 
public void paintComponent(Graphics g) { 
    BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D gbi = result.createGraphics(); 
    BufferedImage x = null; 
    try { 
     x = ImageIO.read(getClass().getResource("/resources/someimage.png")); 
    } catch (IOException ex) { 
     Logger.getLogger(CanvasPanel.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    gbi.drawImage(x, 0, 0, this); 
    gbi.setColor(selectedColor); 
    gbi.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.75f)); 
    gbi.fillRect(0, 0, width, height); 
    g.drawImage(result, 0, 0, this); 
} 
相關問題