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