java - 渲染 2 个图像,顶部图像背景色透明

标签 java java-2d

我正在用java编程。

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

所以我想做的是为背景图像创建一个单独的图像,并使用另一个图像来跟踪鼠标移动和绘制线条。然后,我将这 2 个图像组合起来以显示最终图像。

我无法解决的问题是删除功能。我尝试使用 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)无效草图(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背景图像;

最佳答案

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);
   }

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

关于java - 渲染 2 个图像,顶部图像背景色透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3410278/

相关文章:

Java 2D 着色/填充

java - 裁剪 BufferedImage strip 的有效方法

java - 我如何检查是否已选择一行?

java - 在 java 文件(.java)中使用 javascript 设置和读取/检索 cookie

java - 如何在 TestNG 中使用 Selenium Webdriver 使用文本属性来识别元素

java - 如何使用箭头键在屏幕上移动图形?

java - 从 Fragment 中的 ListView 中的按钮创建 PopupView

java - 在 Play 2.0 中处理 webdav 请求和响应

java - 鼠标拖动时画线问题

java - 如何让重叠的形状产生新的颜色?