将JPanel导出到图像

所以我一直在尝试将我在JPanel上绘制的图像导出到图像中。 我一直在使用这种方法:

BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); paint(g); try { ImageIO.write(image, "png", new File([location goes here]); } catch (IOException e) {} 

我在我想要的位置得到一张图片,但我得到了我的JPanel显示的压缩版本。 如果我也尝试导出BMP,也会发生同样的情况。 有没有办法从JPanel导出像素完美的图像? 提前致谢。

该小组需要根据其要求进行布局。 如果面板尚未在屏幕上实现,则可能无法按预期方式呈现

以下示例假定面板未显示在屏幕上…

 setSize(getPreferredSize()); BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); printAll(g); g.dispose(); try { ImageIO.write(image, "png", new File([location goes here]); } catch (IOException e) { e.printStackTrace(); } 

你应该避免自己调用paint ,如果组件没有在屏幕上实现,它可以抛出exception,而是使用printAll

另外,如果你创建一个资源,你应该处理它;)

更新

我做了这个简单的例子。 屏幕拍摄在顶部,jpeg在左边,png在右边。

jpeg是30kb,png是320kb

在此处输入图像描述

我用这个来创造它……

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class PaintComponent { public static void main(String[] args) { new PaintComponent(); } public PaintComponent() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JPanel paintPane; public TestPane() { paintPane = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; paintPane.add(new JLabel("I'm a label"), gbc); paintPane.add(new JTextField("I'm a text field", 20), gbc); paintPane.add(new JLabel(new ImageIcon("some\pretty\picture")), gbc); setLayout(new BorderLayout()); add(paintPane); JButton paint = new JButton("Capture"); paint.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { BufferedImage image = new BufferedImage(paintPane.getWidth(), paintPane.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); paintPane.printAll(g); g.dispose(); try { ImageIO.write(image, "jpg", new File("Paint.jpg")); ImageIO.write(image, "png", new File("Paint.png")); } catch (IOException exp) { exp.printStackTrace(); } } }); add(paint, BorderLayout.SOUTH); } } } 

我会确保你实际上正在查看正确的文件;)

如果您尝试制作窗口中不可见的面板图像,请查看屏幕图像 。 它将调用面板上的doLayout()以确保正确显示组件。