我有一个 BufferedImage,我试图用透明像素填充一个矩形。问题是,透明像素并没有替换原始像素,而是放在顶部而不执行任何操作。怎样才能完全去掉原来的像素呢?该代码适用于任何其他不透明颜色。
public static BufferedImage[] slice(BufferedImage img, int slices) {
BufferedImage[] ret = new BufferedImage[slices];
for (int i = 0; i < slices; i++) {
ret[i] = copyImage(img);
Graphics2D g2d = ret[i].createGraphics();
g2d.setColor(new Color(255, 255, 255, 0));
for(int j = i; j < img.getHeight(); j += slices)
g2d.fill(new Rectangle(0, j, img.getWidth(), slices - 1));
g2d.dispose();
}
return ret;
}
public static BufferedImage copyImage(BufferedImage source){
BufferedImage b = new BufferedImage(source.getWidth(), source.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = b.getGraphics();
g.drawImage(source, 0, 0, null);
g.dispose();
return b;
}
Using AlphaComposite
,你至少有两个选择:
-
要么,使用AlphaComposite.CLEAR
按照建议,只需用任何颜色填充一个矩形,结果将是一个完全透明的矩形:
Graphics2D g = ...;
g.setComposite(AlphaComposite.Clear);
g.fillRect(x, y, w, h);
-
或者,您可以使用AlphaComposite.SRC
,然后涂上透明(或半透明,如果你喜欢)颜色。这将替换目标处的任何颜色/透明度,结果将是一个完全具有指定颜色的矩形:
Graphics2D g = ...;
g.setComposite(AlphaComposite.Src);
g.setColor(new Color(0x00000000, true);
g.fillRect(x, y, w, h);
如果您只想删除目的地上的内容,第一种方法可能更快更容易。第二种更灵活,因为它允许用半透明甚至渐变或其他图像替换区域。
PS:(正如乔希在链接的答案中所说)完成后不要忘记将组合重置为默认值AlphaComposite.SrcOver
,如果你打算用同样的东西做更多的绘画Graphics2D
目的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)