2011-04-30 28 views
6

它一定是一個非常愚蠢的解決方案,但我是盲目的。BufferedImage當我說紅色時畫白色

我有這樣的代碼:

BufferedImage bi = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB); 
bi.getGraphics().setColor(Color.red); 
bi.getGraphics().fillRect(300, 350, 100, 50); 
ImageIO.write(bi, "jpeg", new File("image.jpg")); 

我得到這個黑色矩形爲800x600並在它的白色矩形。爲什麼是這樣?

謝謝:)

+3

爲了詳細闡述MBFG的文章,您將創建一個新的Graphics對象,每次調用getGraphics時,兩者都不相互關聯。按照他的建議做,然後創建一個Graphics對象。另外,當你完成後不要忘記處置它。 – 2011-04-30 17:33:52

回答

13

每次調用的getGraphics()你得到一個新的圖形對象一個BufferedImage,所以設置一個顏色時,不設置它的下一個。因此緩存圖形對象。

BufferedImage bi = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB); 
Graphics g = bi.getGraphics(); 
g.setColor(Color.red); 
g.fillRect(300, 350, 100, 50); 
ImageIO.write(bi, "jpeg", new File("/home/dave/image.jpg")); 
+1

同意1+。在使用Graphics對象時添加調用來處理它也是很好的習慣。 – 2011-04-30 17:35:22

+0

謝謝!我假設它只是返回圖像圖形對象 – Khanser 2011-04-30 17:35:52

+2

而且,您應該在完成後處理它。 – 2011-04-30 17:35:58

2

僅供參考,以下示例可能對修補圖形上下文非常方便。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.image.BufferedImage; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

/** @http://stackoverflow.com/questions/5843426 */ 
public class RedOrWhite extends JPanel { 

    private static final int W = 800; 
    private static final int H = 600; 

    public RedOrWhite() { 
     this.setLayout(new GridLayout()); 
     this.setPreferredSize(new Dimension(W, H)); 
     int w = W/2; 
     int h = H/2; 
     int r = w/5; 
     BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g = bi.createGraphics(); 
     g.setColor(Color.gray); 
     g.fillRect(0, 0, w, h); 
     g.setColor(Color.blue); 
     g.fillRect(w/2 - r, h/2 - r/2, 2 * r, r); 
     g.dispose(); 
     this.add(new JLabel(new ImageIcon(bi), JLabel.CENTER)); 
    } 

    private void display() { 
     JFrame f = new JFrame("RedOrWhite"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new RedOrWhite().display(); 
      } 
     }); 
    } 
} 
相關問題