Java - 获取JPanel的图像

Chr*_*tis 5 java swing bufferedimage jpanel

我正在写一个我在上面画的程序JPanel.我如何得到一个ImageJPanel这是在上面画了?我尝试了这个代码,但我得到的是一张背景色为我的空白图片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;
    }
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Gui*_*let 2

这是一个 SSCCE,说明它的工作原理。null一个常见的错误是作为方法ImageObserver的来传递drawImage,因为图像的加载是异步的。

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();
                }
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @sijoune 尝试我上面发布的代码并查看与您的代码的差异以发现您的问题。 (2认同)