结合多个graphics2d复合材料?

时间:2015-11-07 18:04:20

标签: java transparency bufferedimage graphics2d

如何将2个合成组合成一个?让我解释一下:

BufferedImage copy = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = copy.createGraphics();
g2d.setComposite(AlphaComposite.Clear);
g2d.fillRect(0, 0, img.getWidth(), img.getHeight());

现在我们有一个透明的图像。

g2d.setComposite(AlphaComposite.Src);
g2d.drawImage(img, 0, 0, null);

现在我们有一个“img”的精确副本,包括透明区域。

g2d.setComposite(BlendComposite.getInstance(BlendingMode.MULTIPLY));
g2d.setColor(overlayColor);
g2d.fillRect(0, 0, img.getWidth(), img.getHeight());

(来自http://www.curious-creature.com/2006/09/20/new-blendings-modes-for-java2d/的BlendComposite) 此时,乘法复合为图像提供了漂亮的颜色(overlayColor)。

但透明区域现在与overlayColor具有相同的颜色。

如何阻止透明区域获取overlayColor?

1 个答案:

答案 0 :(得分:0)

@haraldK指出了一个很好的解决方案:

  

将原始(img)绘制在副本上(使用现有的g2d)   DstIn AlphaComposite?

我在繁殖步骤之后尝试了一下:

g2d.setComposite(AlphaComposite.DstIn);
g2d.drawImage(img, 0, 0,    null);

它现在有效,我的透明度恢复了!

对于有同样问题的人:

AlphaComposite.DstIn:

如果源和目标中的像素重叠,则来自源的alpha将应用于重叠区域中的目标像素。如果alpha = 1.0,则重叠区域中的像素不变;如果alpha为0.0,则清除重叠区域中的像素。

http://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html