Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中绘制点并保存输出图像?_Java_Swing_Jpanel_Bufferedimage_Javax.imageio - Fatal编程技术网

如何在Java中绘制点并保存输出图像?

如何在Java中绘制点并保存输出图像?,java,swing,jpanel,bufferedimage,javax.imageio,Java,Swing,Jpanel,Bufferedimage,Javax.imageio,我试图用x和y坐标绘制一些点,并将输出保存到图像文件中,但我做不到。(不必在JFrame上看到它们) 据我通过搜索了解,我可以创建图形并在JFrame上显示,但我无法将此输出保存到文件中 public static void main(String[] args) { try { final JFrame frm = new JFrame("Points"); final Panel pnl = new Panel(); pnl.setPrefer

我试图用x和y坐标绘制一些点,并将输出保存到图像文件中,但我做不到。(不必在JFrame上看到它们) 据我通过搜索了解,我可以创建图形并在JFrame上显示,但我无法将此输出保存到文件中

public static void main(String[] args) {
try {
        final JFrame frm = new JFrame("Points");
        final Panel pnl = new Panel();
        pnl.setPreferredSize(new Dimension(1000, 1000));
        frm.setContentPane(pnl);
        frm.pack();
        frm.setVisible(true);
        frm.repaint();
        Image img;
        img = frm.createImage(1000, 1000);
        ImageIO.write((RenderedImage) img, "jpeg", new File("C:/.../p.jpeg"));
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    } catch (final Exception e) {
        e.printStackTrace();
    }
}


public static class Panel extends JPanel {

    @Override
    public void paintComponent(final Graphics g) {
        g.setColor(Color.RED);
        for (final Point p : CandidatePoints) {
            g.fillRect((int) p.getX() * 10, (int) p.getY() * 10, 20, 20);
        }}
此外,我尝试了使用ImageIO的BuffereImage的流行解决方案,但在这种情况下,我无法创建坐标系,而是在图像文件中得到了一个黑色矩形

 public static void main(String[] args) {
BufferedImage bimage = new BufferedImage(200, 200,
                BufferedImage.TYPE_BYTE_INDEXED);

        Graphics2D g2d = bimage.createGraphics();

        g2d.setColor(Color.red);
        for (final Point p : CandidatePoints) {
            g2d.fillRect((int) p.getX() * 10, (int) p.getY() * 10, 20, 20);
            ImageIO.write(bimage, "jpeg", new File("C:/.../p.jpeg"));
            g2d.dispose();
        }}

提前感谢您

您不需要任何Swing组件来创建图像并将其保存到文件中

下面是绘制圆并将其保存到文件的一个小示例:

public class ImageExample
{
    public static void main ( String[] args ) throws IOException
    {
        final BufferedImage image = new BufferedImage ( 1000, 1000, BufferedImage.TYPE_INT_ARGB );
        final Graphics2D graphics2D = image.createGraphics ();
        graphics2D.setPaint ( Color.WHITE );
        graphics2D.fillRect ( 0,0,1000,1000 );
        graphics2D.setPaint ( Color.BLACK );
        graphics2D.drawOval ( 0, 0, 1000, 1000 );
        graphics2D.dispose ();

        ImageIO.write ( image, "png", new File ( "C:\\image.png" ) );
    }
}
如果您需要在输出上完全使用jpeg图像,则可能需要使用图像类型

得到黑色矩形的原因是,您不使用任何内容填充背景,并且JPEG格式不支持透明图像-如果您希望图像透明,请使用PNG。或者你可以用你想要的任何颜色来填充图像背景。正如评论中提到的,并非所有图像类型都能很好地处理不同的输出图像格式

此外,以防万一-所有图像和组件上的坐标从左上角开始([0,0]坐标)


如果您想将桌面Swing应用程序UI的一部分保存到图像文件中,则需要使用Swing组件提供的方法将其绘制到从图像中检索的图形上。

要更快获得更好的帮助,请发布或。您不应在循环中写入图像,而应在循环后写入图像,也就是说,首先填充图像,然后写入并处理。此外,
键入字节索引
与JPEG不兼容。您还应该调用
画图组件
的超级方法,这正是我所需要的。非常感谢。