渲染2张图像,顶部图像背景颜色透明

时间:2010-08-04 22:14:43

标签: java java-2d

我正在用java编程。

我基本上是在做类似工具的绘画。用户可以选择背景图像,使用鼠标绘制线条或删除线条。擦除线条时,背景图像应该仍然相同。

所以我试图做的是为背景图像设置一个单独的图像,另一个图像用于跟踪鼠标移动和绘制线条。然后我将这两个图像组合起来显示最终图像。

我无法解决的问题是擦除功能。我尝试使用setXORMode,如果我有一个有1种颜色的背景图像,效果很好。但是如果图像具有渐变颜色,那么我在其上绘制的线也会改变颜色。

以下是我正在处理的代码片段:

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; 

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 个答案:

答案 0 :(得分: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);
   }

然后像平常一样画画。我有一个完整的源代码示例,如果您愿意,我可以分享。

相关问题