Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组合多个图形2D组合?_Java_Transparency_Bufferedimage_Graphics2d - Fatal编程技术网

Java 组合多个图形2D组合?

Java 组合多个图形2D组合?,java,transparency,bufferedimage,graphics2d,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.getHei

如何将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());
(从中混合合成) 此时,乘法合成为图像提供了一种漂亮的颜色(叠加颜色)

但现在透明区域的颜色与叠加颜色相同


我如何防止透明区域的颜色重叠?

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

将原件(img)绘制在副本上(使用现有g2d),并使用 字母复合材料

在乘法步骤之后,我尝试了一下:

g2d.setComposite(AlphaComposite.DstIn);
g2d.drawImage(img, 0, 0,    null);
现在它工作了,我的透明度回来了


对于有相同问题的任何人:

AlphaComposite.DstIn:

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


@haraldK为我指出了一个很好的工作解决方案:

将原件(img)绘制在副本上(使用现有g2d),并使用 字母复合材料

在乘法步骤之后,我尝试了一下:

g2d.setComposite(AlphaComposite.DstIn);
g2d.drawImage(img, 0, 0,    null);
现在它工作了,我的透明度回来了


对于有相同问题的任何人:

AlphaComposite.DstIn:

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


我想你不能。但是你可以通过使用一个步骤,从原来的“恢复”阿尔法来解决这个问题。@haraldK,最大的问题是如何?;-)如果我知道或找到了一种方法,我会非常高兴。用
DstIn
AlphaComposite
?@haraldK将原始(
img
)绘制在
副本上(使用现有的
g2d
)!不知道为什么,但我会读更多关于AlphaComposite的内容。谢谢你的帮助!对于具有相同问题的任何人:如果源和目标中的像素重叠,则源的alpha将应用于重叠区域中的目标像素。如果alpha=1.0,则重叠区域中的像素不变;如果alpha为0.0,则重叠区域中的像素将被清除。我想你不能。但是你可以通过使用一个步骤,从原来的“恢复”阿尔法来解决这个问题。@haraldK,最大的问题是如何?;-)如果我知道或找到了一种方法,我会非常高兴。用
DstIn
AlphaComposite
?@haraldK将原始(
img
)绘制在
副本上(使用现有的
g2d
)!不知道为什么,但我会读更多关于AlphaComposite的内容。谢谢你的帮助!对于具有相同问题的任何人:如果源和目标中的像素重叠,则源的alpha将应用于重叠区域中的目标像素。如果alpha=1.0,则重叠区域中的像素不变;如果alpha为0.0,则重叠区域中的像素将被清除。