2010-08-04 173 views
0

我正在用java編程。渲染2張圖像,頂部圖像背景色透明

我基本上是做一個像油漆一樣的工具。用戶可以選擇背景圖像,使用鼠標繪製線條或擦除線條。當刪除一行時,背景圖像應該仍然是一樣的。

所以我試圖做的是有一個單獨的圖像的背景圖像和另一個圖像來跟蹤鼠標移動和畫線。然後結合這兩張圖片來顯示最終圖像。

我無法解決的問題是擦除功能。我嘗試使用setXORMode,如果我有一種顏色的背景圖像,它會很好用。但是如果圖像具有漸變色,那麼我在它上面繪製的線條也會改變顏色。

這裏是我工作的代碼片段:

private void backgroundImageOverNote() 
{ 
    Graphics2D g = image.createGraphics(); 
    g.drawImage(backgroundImage.getImage(), 0, 0, 400, 200, null); 
    g.drawImage(sketchImage, 0, 0, 400, 200, null); 
    g.dispose(); 
} 

public void sketch(SketchData sketchEvent) 
{ 
    if(isValidXYPosition(sketchEvent.getX(), sketchEvent.getY())) 
    { 
    Graphics2D g = sketchImage.createGraphics(); 
    g.drawLine(oldX, oldY, sketchEvent.getX(), sketchEvent.getY()); 
    g.dispose(); 
    } 
    oldX = sketchEvent.getX(); 
    oldY = sketchEvent.getY(); 
} 


private BufferedImage sketchImage = new BufferedImage(400, 200, BufferedImage.TYPE_INT_ARGB); 
private ImageIcon backgroundImage; 

回答

1

alt text http://grab.by/grabs/81ccdd4ad6b0d78c130bb2a44d665982.png

你並不需要使用XOR的。特別是如果你將這兩層分開,那比這更容易。

// Opaque 
private Composite paintMode = AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f); 
// transparent; erases the foreground image allowing the background image through  
private Composite eraseMode = AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f); 

然後當談到時間得出:

if (drawing) { 
     graphics.setComposite(paintMode); 
    } 
    else { 
     graphics.setComposite(eraseMode); 
    } 

然後烤漆工藝般正常。如果您願意,我可以分享完整的源代碼示例。

+0

感謝您的回覆!但是我之前的帖子可能並不清楚。我使用的第二層有一個白色背景。如果用戶想要擦除一條線,我基本上只需要畫一條白線,與第二層的背景顏色匹配。 我真正想要發生的是當我繪製第二層(sketchImage)時,我不想讓白色在我的最終圖像上繪製。在繪製第二層之前,我將XOR模式設置爲白色,以便它使用與backgroundImage相同的顏色。這導致了我試圖解決的問題。 – dan 2010-08-05 16:49:23

+0

我認爲這是我需要做的:過濾白色透明 http://stackoverflow.com/questions/665406/how-to-make-a-color-transparent-in-a-bufferedimage-and-save- as-png – dan 2010-08-05 16:55:54

+1

試試我的建議 - 相信我,它的工作原理。天真的做法是用頂層與背景層相同的顏色繪製頂層。但更好的解決方案是替代*擦除頂層,讓底層發光。這簡單得多,而且會更容易推理。 我的方法基本上做了鏈接圖像的功能 - 通過設置alpha複合清除,您在圖像上繪製的任何東西都會刪除(設置爲透明)圖像的該部分。 – I82Much 2010-08-05 19:38:25