2012-11-29 49 views
1

我的小型Java程序試圖使png圖像變暗。它在我的Mac上工作正常,但是當我嘗試在安裝了java 1.7_07的Windows PC上運行它時,它除了空的JPanel外沒有任何顯示,圖像完全消失。在Windows 7中使用Graphics2D問題使圖像變暗64位

下面是代碼:

class MapCanvas extends JPanel { 
    private Color color; 
    RescaleOp op; 
    BufferedImage sourceImage, bi; 

    public MapCanvas() { 
     try { 
      sourceImage = ImageIO.read(new File(MAP_FILENAME)); 

      bi = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_INT_ARGB); 

      op = new RescaleOp(.8f, 0, null); 
      bi = op.filter(bi, null); 

      Graphics2D g = bi.createGraphics(); 

      g.drawImage(sourceImage, 0, 0, 500, 382, null); 
      g.dispose(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // set size for the panel 
     Dimension size = new Dimension(500, 382); 
     this.setBackground(new Color(34, 102, 187)); 
     setPreferredSize(size); 
     setSize(size); 
     setLayout(null); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g2d = (Graphics2D) g; 

     g2d.drawImage(bi, op, 0, 0); 
    } 
} 

誰知道爲什麼我得到這個?非常感謝。

+6

「預期它不工作」 - 它是做什麼的話,以及它是如何從你期望什麼不同呢?不要只說「不行」 - 解釋它,否則你只是讓人難以幫助你。 – Jesper

+0

對不起,我已經編輯過。問題是畫布是空的,不顯示圖像。 – tuanva

+1

作爲參考,有一個完整的示例[這裏](http://stackoverflow.com/a/5864503/230513)。 – trashgod

回答

0

我似乎沒有任何問題,但是,幾件事情我跳出這個例子...

首先,我不明白爲什麼你這樣做......

try { 
    sourceImage = ImageIO.read(new File("C:/Users/shane/Dropbox/issue453.jpg")); 

    bi = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_INT_ARGB); 

    op = new RescaleOp(.1f, 0, null); 
    bi = op.filter(bi, null); 

    Graphics2D g = bi.createGraphics(); 

    g.drawImage(sourceImage, 0, 0, 500, 382, null); 
    g.dispose(); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

於是做了此...

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    g2d = (Graphics2D) g; 
    g2d.drawImage(bi, op, 0, 0); 
} 

你基本上是雙重應用RescaleOp

它可能只是簡單地套用RescaleOp直接向sourceImage ...

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    g2d = (Graphics2D) g; 
    g2d.drawImage(sourceImage, op, 0, 0); 
} 

除非你關心性能,在這種情況下,你應該簡單畫出bi沒有任何BufferedImageOp

g2d.drawImage(bi, 0, 0, this); 

其次,你的例子不會編譯,因爲你沒有在你的paintComponent方法中定義​​。這是一個疏忽(這很好),或者你正在緩存Graphics對象,這是不好的。

Graphics對象是無狀態的,它們不會在重繪之間持續存在,您應該永遠不要緩存它們或依賴於getGraphics

0

謝謝你指出我的錯誤。在我的問題中有一些缺失的代碼(Graphics2D g2d - 它只是一個未分配的變量),所以它不能編譯。對於那個很抱歉。

這是我如何固定它:

  `sourceImage = ImageIO.read(new File(MAP_FILENAME)); 

      bi = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_INT_ARGB); 

      float[] scales = { .5f, .5f, .5f, 1f }; 
      float[] offsets = new float[4]; 
      op = new RescaleOp(scales, offsets, null); 

      Graphics2D g1 = bi.createGraphics(); 

      g1.drawImage(sourceImage, 0, 0, 500, 382, null); 
      g1.dispose(); 

      op.filter(sourceImage, bi);` 

我只是使用RGB的值相同的尺度陣列中(這是它應該是),然後繪製過濾後的圖像。

  `g2d.drawImage(bi, 0, 0, 500, 382, null);` 

乾杯