2011-04-30 13 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

एमबीएफजी की पोस्ट पर विस्तार करने के लिए, आप ग्राफिक्स प्राप्त करने के लिए प्रत्येक कॉल के साथ एक नया ग्राफिक्स ऑब्जेक्ट बना रहे हैं, दोनों एक दूसरे से असंबंधित हैं। वह जो करता है उसके बजाय वह करें और एक ग्राफिक्स ऑब्जेक्ट बनाएं। साथ ही, जब आप पूरा कर लें तो इसे निपटाना न भूलें। –

उत्तर

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+। इसके अलावा यह निपटान के लिए ग्राफिक्स वस्तु पर जब यह साथ किया कॉल जोड़ने के लिए अच्छी आदत है। –

+0

धन्यवाद! मैं assumming गया था यह केवल छवि ग्राफिक्स – Khanser

+2

वस्तु और लौट रहा था, तो आप इसे निपटाने चाहिए जब किया। –

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(); 
      } 
     }); 
    } 
} 
संबंधित मुद्दे