[英]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
,您至少有兩個選擇:
要么按照建議使用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 :(如Josh在鏈接的答案中所述),如果您打算使用相同的Graphics2D
對象進行更多繪制,請不要忘記在完成后將合成重置為默認的AlphaComposite.SrcOver
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.