2012-06-19 17 views
5

की एक छवि प्राप्त करें मैं एक प्रोग्राम लिख रहा हूं जिसमें मैं JPanel पर पेंट करता हूं। मैं JPanel का Image कैसे प्राप्त करूं जो इसे चित्रित किया गया है? मैंने इस कोड को आजमाया लेकिन मुझे जो कुछ मिलता है वह मेरे JPanel के पृष्ठभूमि रंग के साथ एक खाली छवि है। BufferedImage में मेरे पैनल पर चित्रित नहीं है।जावा - एक जेपीनेल

private BufferedImage createImage(JPanel panel) {  
     int w = panel.getWidth(); 
     int h = panel.getHeight(); 
     BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g = bi.createGraphics(); 
     panel.paint(g); 
     return bi; 
    } 

मैं क्या गलत कर रहा हूं?

+0

पोस्टिंग कैसे आप अपनी छवि आकर्षित पर विचार करें। क्या आप graphics.drawImage का उपयोग करते हैं? यदि हां, ImageObserver तर्क क्या है? –

उत्तर

2

यहां एक एसएससीसीई है जो यह दर्शाता है कि यह काम करता है। drawImage विधि के ImageObserver के रूप में null को पास करना एक आम गलती है, क्योंकि छवि की लोडिंग असीमित है।

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestPrint { 

    protected static void initUI() throws MalformedURLException { 
     final ImageIcon image = new ImageIcon(new URL("http://www.travelblog.org/Wallpaper/pix/tb_fiji_sunset_wallpaper.jpg")); 
     JPanel panel = new JPanel() { 
      @Override 
      protected void paintComponent(java.awt.Graphics g) { 
       super.paintComponent(g); 
       g.drawImage(image.getImage(), 0, 0, this); 
      }; 
     }; 
     panel.setPreferredSize(new Dimension(image.getIconWidth(), image.getIconHeight())); 
     panel.setSize(panel.getPreferredSize()); 
     BufferedImage bi = new BufferedImage(panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_RGB); 
     Graphics g = bi.createGraphics(); 
     panel.print(g); 
     g.dispose(); 
     try { 
      ImageIO.write(bi, "png", new File("test.png")); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

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

      @Override 
      public void run() { 
       try { 
        initUI(); 
       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 
+0

ने कोशिश की, काम नहीं करता है। –

+2

@sijoune मैंने ऊपर पोस्ट किया गया कोड आज़माएं और अपनी समस्या को हल करने के लिए अपने कोड के साथ अंतर देखें। –

2

आपका कोड मेरे लिए काम करता है।

यहां एक साधारण उदाहरण है। पैनल परिवर्तन आकार देखने के लिए फ्रेम का आकार बदलें और छवि चारों ओर घूमती है।

public static void main(String[] args) { 
    JFrame frame = new JFrame("Test"); 
    JPanel panel = new JPanel(); 
    panel.setBackground(Color.BLUE); 
    JLabel label = new JLabel("Image"); 
    label.setForeground(Color.RED); 
    panel.add(label); 
    frame.add(panel, BorderLayout.NORTH); 
    frame.pack(); 
    JLabel image = new JLabel(new ImageIcon(createImage(panel))); 
    frame.add(image, BorderLayout.SOUTH); 
    frame.pack(); 
    label.setText("Original");  
    frame.setVisible(true); 
} 

private static BufferedImage createImage(JPanel panel) { 
    int w = panel.getWidth(); 
    int h = panel.getHeight(); 
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = bi.createGraphics(); 
    panel.paint(g); 
    return bi; 
} 

तो आपकी समस्या कहीं और होनी चाहिए। सुनिश्चित करें कि आपके पैनल के बिंदु पर सकारात्मक आकार है कि आप इसकी एक छवि बनाते हैं।

2

यहां एक त्वरित उदाहरण विधि है जिसे आप अपने किसी भी जावा 2/जेडीके 1.2 अनुप्रयोगों में जोड़ सकते हैं। बस उस घटक को पास करें जिसे आप स्नैपशॉट और उस फ़ाइल नाम में सहेजना चाहते हैं जिसे आप सहेजना चाहते हैं।

public void saveComponentAsJPEG(Component myComponent, String filename) { 
    Dimension size = myComponent.getSize(); 
    BufferedImage myImage = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g2 = myImage.createGraphics(); 
    myComponent.paint(g2); 
    try { 
     OutputStream out = new FileOutputStream(filename); 
     JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); 
     encoder.encode(myImage); 
     out.close(); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

यह विधि बहुत बहुमुखी है। इसका उपयोग विभिन्न प्रकार के जावा एप्लिकेशन घटकों के स्नैपशॉट लेने के लिए किया जा सकता है। कृपया सावधान रहें, हालांकि, आप अपने कोड की पोर्टेबिलिटी के लिए कुछ जोखिम पर com.sun.image.codec.jpeg का उपयोग करते हैं।

संपादित करें: मुझे यकीन है कि बनाने के लिए कोड का परीक्षण किया और सब ठीक लगता है:

import com.sun.image.codec.jpeg.JPEGCodec; 
import com.sun.image.codec.jpeg.JPEGImageEncoder; 
import java.awt.*; 
import java.awt.geom.Ellipse2D; 
import java.awt.image.BufferedImage; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class ScreenCapture extends JFrame { 

    public ScreenCapture() { 
     createAndShowUI(); 
    } 

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

      @Override 
      public void run() { 
       ScreenCapture screenCapture = new ScreenCapture(); 
      } 
     }); 
    } 

    private void createAndShowUI() { 
     setTitle("Test Screen Capture"); 
     setSize(300, 300); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     getContentPane().add(new DrawingPanel()); 
     setVisible(true); 
     saveComponentAsJPEG(this, "C:/test.jpg"); 

    } 

    public void saveComponentAsJPEG(Component myComponent, String filename) { 
     Dimension size = myComponent.getSize(); 
     BufferedImage myImage = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g2 = myImage.createGraphics(); 
     myComponent.paint(g2); 
     try { 
      OutputStream out = new FileOutputStream(filename); 
      JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); 
      encoder.encode(myImage); 
      out.close(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

    class DrawingPanel extends JPanel { 

     public DrawingPanel() { 
      setDoubleBuffered(true); 
     } 

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

      RenderingHints rhints = g2d.getRenderingHints(); 
      boolean antialiasOn = rhints.containsValue(RenderingHints.VALUE_ANTIALIAS_ON); 

      if (!antialiasOn) { 
       g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      } 

      Shape circle = new Ellipse2D.Float(100.0f, 100.0f, 100.0f, 100.0f); 

      g2d.setColor(Color.RED); 
      g2d.draw(circle); 
      g2d.fill(circle); 
     } 
    } 
} 
+0

मैंने कोशिश की और वही बात होती है। मुझे यह नहीं मिला। मुझे कुछ और गलत करना होगा, लेकिन मुझे यह नहीं मिल रहा है। –

+0

मेरा संपादन जांचें, और फिर उस कोड को पोस्ट कर सकते हैं जो समस्याएं दे सकता है, मैं नहीं देखता कि कैसे, क्योंकि जब आप एक घटक को पास कर लेते हैं और विधि में फ़ाइल नाम बदलते हैं तो यह बाकी होता है? –