组合多个 graphics2d 复合材料?
Combine multiple graphics2d composites?
如何将 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?
@haraldK 指出一个不错的解决方案:
Paint the original (img) over the copy (using the existing g2d) with
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
如何将 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?
@haraldK 指出一个不错的解决方案:
Paint the original (img) over the copy (using the existing g2d) with 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