【问题标题】:BufferedImage fill rectangle with transparent pixelsBufferedImage 用透明像素填充矩形
【发布时间】:2017-05-10 01:07:15
【问题描述】:

我有一个 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。我不确定这个问题是否有 exact 重复,但请查看stackoverflow.com/a/6297069/3182664(忽略那里接受的答案。正确的方法是使用AlphaComposite,如我链接到的答案)
  • @Marco13 谢谢,效果很好!也许将其作为答案发布,以便我接受?
  • @minerguy31 你可以自己回答,因为答案不是完全被接受的重复答案

标签: java bufferedimage


【解决方案1】:

使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多