簡體   English   中英

BufferedImage填充具有透明像素的矩形

[英]BufferedImage fill rectangle with transparent pixels

我有一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM