2010-04-15 98 views
2

我注意到,當我繪製顏色(0,0,0,0),這是另一個圖像上的東西,顯示的顏色是JFrame背景,而不是它下面的圖像。bufferedimage對象的透明度

幫助我找到解決方案的原因是什麼?

謝謝!

編輯:看到圓圈,灰色區域(角落)應該是透明的,但不是,而是它們是JFrame的顏色。 alt text http://img72.imageshack.us/img72/9657/transparency.png

這裏是繪製圓代碼:

 
public void paint(final Graphics g) { 
     super.paintComponent(g); 
     final Graphics2D g2 = (Graphics2D) g; 

     RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     if (unitImage == null) { 

      unitImage = (BufferedImage) (createImage(30, 30)); 
      final Graphics2D gc = unitImage.createGraphics(); 
      gc.setRenderingHints(rh); 
      gc.setColor(outsideColor); 
      gc.fillOval(0, 0, diameter, diameter); 
      gc.setColor(middleColor); 
      gc.fillOval(diameter/6, diameter/6, (diameter/3) * 2, (diameter/3) * 2); 
      gc.setColor(innerColor); 
      gc.fillOval(diameter/3, diameter/3, diameter/3, diameter/3); 
     } 

     g2.drawImage(unitImage, null, 0, 0); 

已與Alphacomposites玩弄,我認爲它不是解決辦法。所以我加入了我相信的所有這些新信息,將幫助你們給我另一個提示。

回答

6

@Chuk李是正確的:除非你改變它,默認Graphics2D複合材料是AlphaComposite.SrcOver。這個方便的tool顯示選定規則和指定的一對顏色和字母的複合結果。

附錄:一種方法是重寫paintComponent()和渲染兩個地圖和圓,但您可能能夠使邊角透明通過清除阿爾法:

... 
gc.setRenderingHints(rh); 
gc.setComposite(AlphaComposite.Clear); 
gc.fillRect(0, 0, diameter, diameter); 
gc.setComposite(AlphaComposite.Src); 
gc.setColor(outsideColor); 
... 

是否createImage(30, 30)涉及到diameter?你爲什麼重寫paint()並調用super.paintComponent(g)

+0

不錯的工具。 3個字符。 – 2010-04-17 22:19:15

7

您是否在繪製之前設置了AlphaComposite?

Graphics2D g2d = (Graphics2D)g; //Some graphics object 
//Save the original 
Composite original = g2d.getComposite(); 
//Set to semi translucent 
Composite translucent = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); 
g2d.setComposite(translucent); 

//Draw 

//Set back to original 
g2d.setComposite(original); 

免責聲明:代碼注測試

2

您正在繪製不透明度爲0.如果它是黑色,則使用顏色(0,0,0,255)。

UPDATE

對不起,我誤解了你的問題。讀過你添加到你的文章中的代碼後,我假設小目標是放置在繪製在父組件上的地圖頂部的組件。

爲了確保透明是指你需要兩樣東西:

  1. 你需要調用setOpaque(假)的對象成分
  2. 要麼平局直接目標的構造沒有後備存儲,或使用RGBA圖像:

    unitImage = new BufferedImage(30,30,BufferedImage.TYPE_INT_ARGB);

+0

問題是在緩衝圖像中填充的矩形應該是它下面的圖層的顏色,也是緩衝圖像。我將0設置爲透明度。 – 2010-04-17 21:50:40

+0

對不起,更新了這個職位 – 2010-04-18 07:09:00

+0

在我聲明的類的字段區域中: BufferedImage unitImage = new BufferedImage(30,30,BufferedImage。TYPE_INT_ARGB); 在相同等級的塗裝方法中: unitImage =(BufferedImage)(createImage(30,30)); \t \t \t final Graphics2D gc = unitImage.createGraphics(); ---這裏的繪圖代碼--- 而現在的目標根本沒有繪製。或者它們也是透明的! – 2010-04-18 17:41:29