Java 通过两种方式获取BuffereImage

Java 通过两种方式获取BuffereImage,java,swing,Java,Swing,我对两个swingBuffereImage从给定的可见组件获取方法感到好奇。 一种方法是将()组件绘制到buffereImage,另一种方法是绘制图像() 有趣的是它的行为方式: 绘制时,它会产生空灰色图像(方法saveBufferedImageByDraw) 在绘制时,它会生成正确的组件图像(方法saveBufferedImageByPaint) 请给我一个简短的解释 下面是示例源代码(要运行,您需要设置正确的输出\u目录): g2.drawImage(图像,0,0,组件)实际上没有做任何有用

我对两个swing
BuffereImage
从给定的可见组件获取方法感到好奇。 一种方法是将()组件绘制到
buffereImage
,另一种方法是绘制图像()

有趣的是它的行为方式:

  • 绘制时,它会产生空灰色图像(方法
    saveBufferedImageByDraw
  • 在绘制时,它会生成正确的组件图像(方法
    saveBufferedImageByPaint
  • 请给我一个简短的解释

    下面是示例源代码(要运行,您需要设置正确的
    输出\u目录
    ):


    g2.drawImage(图像,0,0,组件)
    实际上没有做任何有用的事情-
    g2
    属于该图像,因此您正在其上绘制一个(空)图像。Kiheru,谢谢您提供详细信息。因此,要使用
    drawImage
    方法获取组件的
    buffereImage
    ,我必须使用
    g2
    即父组件的?我说的对吗?组件不是以图像的形式存在的(您在屏幕上看到的只是组件在临时缓冲区上绘制的内容),所以当您需要图像时,您需要自己创建它。使用
    printAll()
    是正确的。(
    paintAll()
    也可以,它们之间的区别几乎没有文档记录;事实上,默认情况下它们最终运行相同的代码。
    print*
    是建议对屏幕外缓冲区进行绘制的方法)。好的,现在我明白了。非常感谢。
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Graphics2D;
    import java.awt.GraphicsEnvironment;
    import java.awt.HeadlessException;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    import javax.swing.BorderFactory;
    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class SaveTest extends JFrame {
    
        private static final String PAINT_STATUS = "Paint status : ";
    
        private static final String DRAW_STATUS = "Draw status : ";
    
        private static final File OUTPUT_DIRECTORY = new File(".....");
    
        private JLabel messageDraw;
    
        private JLabel messagePaint;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new SaveTest();
                }
            });
        }
    
    
        public SaveTest() throws HeadlessException {
            super();
            initialize();
        }
    
        private void initialize() {
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            messageDraw = new JLabel(DRAW_STATUS);
            messagePaint = new JLabel(PAINT_STATUS);
            JButton button = new JButton("Create images");
            button.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    create(SaveTest.this);
                }
            });
    
            JPanel messagesPane = new JPanel();
            messagesPane.setBorder(BorderFactory.createTitledBorder("Save statuses"));
            messagesPane.setPreferredSize(new Dimension(400, 100));
    
            messagesPane.setLayout(new BoxLayout(messagesPane, BoxLayout.PAGE_AXIS));
            messagesPane.add(Box.createHorizontalGlue());
            messagesPane.add(messageDraw);
            messagesPane.add(messagePaint);
    
            JPanel buttonsPane = new JPanel();
            buttonsPane.setLayout(new BoxLayout(buttonsPane, BoxLayout.LINE_AXIS));
            buttonsPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            buttonsPane.add(button);
    
    
            Container contentPane = getContentPane();
            contentPane.add(messagesPane, BorderLayout.CENTER);
            contentPane.add(buttonsPane, BorderLayout.PAGE_END);
    
            this.pack();
            this.setVisible(true);
        }
    
    
        /**
         * Creates the image of current component.
         *
         * @param component the component
         */
        public void create(Component component) {
            if (component != null && component.isVisible()
                    && !GraphicsEnvironment.isHeadless()) {
    
                try {
                    saveBufferedImageByPaint(component);
                    messagePaint.setText(PAINT_STATUS + "OK");
                } catch (Exception e) {
                    messagePaint.setText(PAINT_STATUS + "ERROR : " + e.getMessage());
                }
                try {
                    saveBufferedImageByDraw(component);
                    messageDraw.setText(DRAW_STATUS + "OK");
                } catch (Exception e) {
                    messageDraw.setText(DRAW_STATUS + "ERROR : " + e.getMessage());
                }
            } else {
                messagePaint.setText(PAINT_STATUS + "ERROR : invalid component state");
                messageDraw.setText(DRAW_STATUS + "ERROR : invalid component state");
            }
        }
    
        private void saveBufferedImageByDraw(Component component) {
            BufferedImage image = (BufferedImage) component.createImage(component.getWidth(), component.getHeight());
            Graphics2D g2 = image.createGraphics();
            g2.drawImage(image, 0, 0, component);
            g2.dispose();
            saveImage(image, "DRAW");
        }
    
        private void saveBufferedImageByPaint(Component component) {
            BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB);
            Graphics2D g2 = image.createGraphics();     
            component.printAll(g2);
            g2.dispose();
    
            saveImage(image, "PAINT");
        }
    
    
        public static void saveImage(BufferedImage image, String prefix) {
            try {
                File f = new File(OUTPUT_DIRECTORY, prefix + ".png");
                ImageIO.write(image, "PNG", f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }