Java 渲染两个顶部图像背景色为透明的图像

Java 渲染两个顶部图像背景色为透明的图像,java,java-2d,Java,Java 2d,我在用java编程 我基本上是在做一个类似绘画的工具。用户可以选择背景图像、使用鼠标绘制线或擦除线。擦除线条时,背景图像应保持不变 因此,我试图做的是有一个单独的图像作为背景图像和另一个图像来跟踪鼠标移动和绘制线。然后,我将这两个图像组合起来,以显示最终的图像 我无法解决的问题是擦除功能。我试着使用setXORMode,如果我有一个只有一种颜色的背景图像,它会非常有效。但是如果图像有渐变颜色,那么我在上面画的线也会改变颜色 以下是我正在编写的代码片段: private void backgro

我在用java编程

我基本上是在做一个类似绘画的工具。用户可以选择背景图像、使用鼠标绘制线或擦除线。擦除线条时,背景图像应保持不变

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

我无法解决的问题是擦除功能。我试着使用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; 

您根本不需要使用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);
   }

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

谢谢您的回复!但我可能不清楚我之前的帖子。我使用的第二层是白色背景。如果用户想要删除一条线,我只需要画一条与第二层背景颜色相匹配的白色线。我真正想做的是,当我画第二层(sketchImage)时,我不想在我的最终图像上画白色。在绘制第二层之前,我将XOR模式设置为白色,以便它使用与背景图像相同的颜色。这导致了我试图解决的问题。我想这就是我需要做的:过滤白色到透明-试试我的建议-相信我,它是有效的。天真的做法是在顶层绘制与背景层相同的颜色。但是一个更好的解决办法是抹去顶层,让底层发光。它更简单,也更容易推理。我的方法基本上实现了链接图像的功能-通过将alpha composite设置为clear,您在图像上绘制的任何内容都会擦除(设置为transparent)图像的该部分。