【问题标题】:Why my image does not save为什么我的图像不保存
【发布时间】:2017-05-14 17:38:02
【问题描述】:

我有一个简单的程序,上面有 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");
        }

    }
}

【问题讨论】:

  • mainPanel.createImage(300, 300); 生成一个空白图像,兼容在面板上显示。它不是当前面板上的图像。顺便说一句 - 还有另一种方法可以解决这个问题。创建一个BufferedImage 以显示在JLabel 中。绘制缓冲图像,然后repaint() 标签以查看更改。需要时保存该图像。
  • @AndrewThompson 所以你想说我不能选择 Jpanel 的图形,在其中绘制然后将结果复制到 BufferedImage?我只能在 BufferedImage 上绘图并将结果复制到 JPanel,是吗?
  • 我不想说这样的话。就像我描述的那样更容易

标签: java swing graphics jframe jpanel


【解决方案1】:

不要使用 getGraphics()。那不是您进行自定义绘画的方式。

相反,您需要覆盖 JPanel 的 paintComponent() 方法并在该方法中进行自定义绘制。阅读 Custom Painting 上的 Swing 教程部分,了解更多信息和工作示例。

BufferedImage image = (BufferedImage)mainPanel.createImage(300, 300);

所做的只是创建一个空的 BufferedImage。

您需要使用其 Graphics 对象在 BufferedImage 上绘制一些东西。基本代码是这样的:

BufferedImage image = new BufferedImage(theWidth, theHheight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
someComponent.print( g2d );
g2d.dispose();

但是,上述逻辑仅在可见 GUI 上完成时才有效。这意味着您需要创建框架并将面板添加到框架中。然后,您将创建一个“保存图像”按钮以添加到框架中。然后向按钮添加一个 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();

【讨论】:

  • 如果我把我的代码放到paintComponent()中,我会收到一个绘图图像吗?
猜你喜欢
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 2021-03-24
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
相关资源
最近更新 更多