【问题标题】:Combine multiple graphics2d composites?结合多个graphics2d复合材料?
【发布时间】:2015-11-07 18:04:20
【问题描述】:

如何将 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/ 的混合合成) 至此,乘法合成已经给图像一个漂亮的颜色(overlayColor)。

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

如何防止透明区域获得overlayColor?

【问题讨论】:

  • 我怀疑你不能。但是你可以通过我猜的步骤“恢复”原始的 alpha 来解决它。
  • @haraldK ,最大的问题是如何? ;-) 如果我知道或找到了这样做的方法,我会非常高兴。
  • DstInAlphaCompositecopy(使用现有的g2d)上绘制原始(img)?
  • @haraldK 有效!不知道为什么,但我将阅读更多关于 AlphaComposite 的内容。感谢您的帮助!
  • 对于任何有相同问题的人:如果源和目标中的像素重叠,则源中的 alpha 将应用于重叠区域中的目标像素。如果 alpha = 1.0,则重叠区域的像素不变;如果 alpha 为 0.0,则清除重叠区域中的像素。 docs.oracle.com/javase/tutorial/2d/advanced/compositing.html

标签: java transparency bufferedimage graphics2d


【解决方案1】:

@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 2013-07-02
    • 2016-04-21
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多