簡體   English   中英

在非透明的BufferedImage上繪制一個透明的BufferedImage

[英]Drawing a transparent BufferedImage over a non-transparent BufferedImage

我在繪制BufferedImages時遇到問題。 我正在使用基於2D瓷磚的地圖編輯器,當我繪制瓷磚時,它首先繪制了下一層,然后是頂層。 像這樣:

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.drawImage(tileLayer, 0, 0, null);
    g.drawImage(objectLayer, 0, 0, null);
}

請注意,此方法在擴展JLabel的類中。 它實際上是在重繪已設置的ImageIcon。 現在,要了解該問題,您必須意識到在創建objectLayer BufferedImage之前,將檢查每個像素是否具有某種顏色。 如果像素是該顏色,則將像素設置為全白,alpha值為0(這樣它將是透明的)。 例:

    int transparentRed = transparentColor.getRed();
    int transparentGreen = transparentColor.getGreen();
    int transparentBlue = transparentColor.getBlue();


for (int x = 0; x < image.getWidth(); x++)
{
    for (int y = 0; y < image.getHeight(); y++)
    {
        int color = i.getRGB(x, y);

        int red = (color & 0x00FF0000) >> 16;
        int green = (color & 0x0000FF00) >> 8;
        int blue = color & 0x000000FF;

        // If the pixel matches the specified transparent color
        // Then set it to an absolute white with alpha at 0
        if (red == transparentRed && green == transparentGreen && blue == transparentBlue)
            i.setRGB(x, y, 0x00FFFFFF);
    }
}

    return i; 

重點是在不影響任何先前放置的下層像素的情況下在最下層上繪制頂層。 頂層的白色像素不應出現。

問題是,這在某些圖像上有效,而在其他圖像上則無效。 在某些圖像上,當我去繪制頂層時,無論如何它只會繪制白色(就像alpha值未設置為0一樣),而在其他圖像上,它像超級按鈕一樣工作並且不會繪制白色像素在。

我只使用過.png圖片,所以我知道它與格式無關。 我已經嘗試了很多不同的方法,但是如果有人可以幫忙,我就會陷入困境。

我相信默認情況下BufferedImage不支持Alpha通道。 構造BufferedImage時,傳入BufferedImage.TYPE_INT_ARGB可解決此問題。

暫無
暫無

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

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