BufferedImage填充矩形,带有透明像素

我有一个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; } 

使用AlphaComposite ,您至少有两个选项:

  1. 或者,按照建议使用AlphaComposite.CLEAR ,只需填充任何颜色的矩形,结果将是一个完全透明的矩形:

     Graphics2D g = ...; g.setComposite(AlphaComposite.Clear); g.fillRect(x, y, w, h); 
  2. 或者,您可以使用AlphaComposite.SRC ,并以透明(或半透明,如果您喜欢)颜色绘制。 这将替换目标处的任何颜色/透明度,结果将是一个具有指定颜色的矩形:

     Graphics2D g = ...; g.setComposite(AlphaComposite.Src); g.setColor(new Color(0x00000000, true); g.fillRect(x, y, w, h); 

如果您想要删除目的地的内容,第一种方法可能更快更容易。 第二种是更灵活,因为它允许替换半透明或甚至渐变或其他图像的区域。


PS :(正如Josh在链接答案中所说的那样)如果您计划使用相同的Graphics2D对象进行更多绘画,请不要忘记在完成后将复合重置为默认的AlphaComposite.SrcOver