【问题标题】:Render 2 images with the top image background color transparent渲染 2 张图像,顶部图像背景颜色透明
【发布时间】:2010-08-05 10:58:28
【问题描述】:

我正在用 java 编程。

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

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

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

这是我正在处理的代码的 sn-p:

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; 

【问题讨论】:

    标签: java java-2d


    【解决方案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);
       }
    

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

    【讨论】:

    • 感谢您的回复!但我之前的帖子可能不清楚。我使用的第二层有白色背景。如果用户想擦除一条线,我基本上只画一条与第二层的背景颜色相匹配的白色线。我真正想要发生的是当我绘制第二层(sketchImage)时,我不希望白色绘制在我的最终图像上。在绘制第二层之前,我将 XOR 模式设置为白色,以便它使用与 backgroundImage 相同的颜色。这导致了我试图解决的问题。
    • 我认为这是我需要做的:过滤白色到透明stackoverflow.com/questions/665406/…
    • 试试我的建议 - 相信我,它有效。最幼稚的做法是在顶层上绘制与背景层相同的颜色。但更好的解决方案是改为擦除顶层,让底层发光。它更简单,并且更容易推理。我的方法基本上完成了链接图像的作用 - 通过将 alpha 合成设置为清除,您在图像上绘制的任何内容都会擦除(设置为透明)图像的该部分。
    猜你喜欢
    • 2017-06-18
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多