2010-08-04 233 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