为什么我的图像没有保存
Why my image does not save
我有一个带有 JFrame 和 Jpanel 的简单程序,我想在 JPanel 上画一条线并将绘图结果保存到图像中。但是完全不行。
我哪里错了?
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
public class source {
public static void main(String[] args) {
JFrame window = new JFrame("TEST");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
mainPanel.setVisible(true);
mainPanel.setSize(800, 600);
mainPanel.setPreferredSize(new Dimension(300,300));
window.setContentPane(mainPanel);
window.setSize(800, 600);
window.pack();
window.setVisible(true);
Graphics g = mainPanel.getGraphics();
g.setColor(Color.BLACK);
g.drawLine(0, 0, 50, 50);
BufferedImage image = (BufferedImage)mainPanel.createImage(300, 300);
try {
System.out.println("Saved");
ImageIO.write(image, "PNG", new File("filename1.png"));
} catch (IOException ex) {
Logger.getLogger(source.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Not saved");
}
}
}
不要使用 getGraphics()。那不是您进行定制绘画的方式。
相反,您需要覆盖 JPanel 的 paintComponent()
方法并在该方法中进行自定义绘画。阅读有关 Custom Painting 的 Swing 教程部分,了解更多信息和工作示例。
BufferedImage image = (BufferedImage)mainPanel.createImage(300, 300);
所做的只是创建一个空的 BufferedImage。
您需要使用 BufferedImage 的 Graphics 对象在 BufferedImage 上绘制一些东西。基本代码是这样的:
BufferedImage image = new BufferedImage(theWidth, theHheight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
someComponent.print( g2d );
g2d.dispose();
然而,上述逻辑仅在可见的 GUI 上完成时才有效。这意味着您需要创建框架并将面板添加到框架中。然后您将创建一个 "Save Image" 按钮以添加到框架中。然后向按钮添加一个 ActionListener。在侦听器代码中,您创建 BufferedImage 并将图像保存到文件中。
或者,如果您只想创建一个图像并将其保存到一个文件中,那么您只需直接绘制到 BufferedImage:
BufferedImage image = new BufferedImage(theWidth, theHheight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setColor( Color.WHITE );
g2d.fillRect(0, 0, theWidth, theHeight);
g2d.setColor( Color.Black );
g2d.drawLine(...);
g2d.dispose();
我有一个带有 JFrame 和 Jpanel 的简单程序,我想在 JPanel 上画一条线并将绘图结果保存到图像中。但是完全不行。
我哪里错了?
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
public class source {
public static void main(String[] args) {
JFrame window = new JFrame("TEST");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
mainPanel.setVisible(true);
mainPanel.setSize(800, 600);
mainPanel.setPreferredSize(new Dimension(300,300));
window.setContentPane(mainPanel);
window.setSize(800, 600);
window.pack();
window.setVisible(true);
Graphics g = mainPanel.getGraphics();
g.setColor(Color.BLACK);
g.drawLine(0, 0, 50, 50);
BufferedImage image = (BufferedImage)mainPanel.createImage(300, 300);
try {
System.out.println("Saved");
ImageIO.write(image, "PNG", new File("filename1.png"));
} catch (IOException ex) {
Logger.getLogger(source.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Not saved");
}
}
}
不要使用 getGraphics()。那不是您进行定制绘画的方式。
相反,您需要覆盖 JPanel 的 paintComponent()
方法并在该方法中进行自定义绘画。阅读有关 Custom Painting 的 Swing 教程部分,了解更多信息和工作示例。
BufferedImage image = (BufferedImage)mainPanel.createImage(300, 300);
所做的只是创建一个空的 BufferedImage。
您需要使用 BufferedImage 的 Graphics 对象在 BufferedImage 上绘制一些东西。基本代码是这样的:
BufferedImage image = new BufferedImage(theWidth, theHheight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
someComponent.print( g2d );
g2d.dispose();
然而,上述逻辑仅在可见的 GUI 上完成时才有效。这意味着您需要创建框架并将面板添加到框架中。然后您将创建一个 "Save Image" 按钮以添加到框架中。然后向按钮添加一个 ActionListener。在侦听器代码中,您创建 BufferedImage 并将图像保存到文件中。
或者,如果您只想创建一个图像并将其保存到一个文件中,那么您只需直接绘制到 BufferedImage:
BufferedImage image = new BufferedImage(theWidth, theHheight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setColor( Color.WHITE );
g2d.fillRect(0, 0, theWidth, theHeight);
g2d.setColor( Color.Black );
g2d.drawLine(...);
g2d.dispose();