当前位置: 首页 > 知识库问答 >
问题:

保存已使用graphics2d、java绘制的缓冲图像

姚善
2023-03-14

我试图保存一个自助式图像,我已经画了一个新的文件。我打开这个文件,使用图形2d在上面绘制(然后在JFrame中显示图像,以确保其工作,它确实这样做),然后将其保存到一个新文件中。

问题是:保存的文件只是原始图像。它不包含我在上面绘制的任何新图形。

以下是我的代码的简化版本:

public driver() throws IOException {
        try {
            image = ImageIO.read(new File("src/mc_map.png"));
        } catch (IOException e) { e.printStackTrace(); }
        this.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
        image = process(image);
    }

稍后在另一种方法中:

    g.draw(new Line2D.Double(road.start.x, road.start.y, road.end.x, road.end.y));
...
br.close();
        image.createGraphics();
        File map = new File("map.png");
        ImageIO.write(image, "png", map);

相关方法:

private BufferedImage process(BufferedImage old) throws IOException {
        int w = old.getWidth();
        int h = old.getHeight();
        BufferedImage img = new BufferedImage(
            w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = img.createGraphics();
        g2d.drawImage(old, 0, 0, null);
        g2d.setPaint(Color.BLUE);
        g2d.drawLine(407, 355, 371, 349);
        readAndDraw(g2d);
        g2d.dispose();
        return img;
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }

    private static void create() throws IOException {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new driver());
        f.pack();
        f.setVisible(true);
    }

共有2个答案

曹乐意
2023-03-14

然后在JFrame中显示图像,以确保其工作

使用屏幕图像获取任何组件的缓冲区图像,并将图像保存到文件中。

武博艺
2023-03-14

我最近遇到了一个非常相似的问题,所以这是我的解决方案:)。

frame只是指正在绘制的JFrame,宽度和高度指正在保存的图像的大小。

    try {
        BufferedImage saving = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics graphics = saving.createGraphics();
        frame.paint(graphics);
        g.dispose(graphics);
        File map = new File("map.png");
        ImageIO.write(saving, "png", map);
    } catch(IOException exc) {
        System.out.println("problem saving");
    }

编辑:如果你的JFrame包含除了你想要保存的图像之外的任何东西,我建议你在JFrame中添加一个JPanel,然后画出它。您将以与您现在所做的几乎相同的方式绘制,但是在保存时,您将用JPanel的名称替换代码中的框架。

 类似资料:
  • 问题内容: 我正在尝试使用Java的Graphics2D在屏幕上绘制图像。这是我正在使用的代码。我想看到图像在屏幕上稳定移动。目前,我可以看到图像,但是除非调整窗口大小,否则图像不会移动,在这种情况下,图像确实会移动。我已经勾勒出以下课程。 传递给Tester的Component对象是以下类: 我确保此类仅添加了一个精灵。Sprite类大致如下: 但是,我在屏幕上仅看到固定的Bowser图像。除非

  • 问题内容: 我想在另一幅图像上绘制部分透明的图像(在物体上形成阴影)。我目前正在使用Java的Graphics2D类进行渲染,有人告诉我将合成设置为AlphaComposite,但这仅将其设置为完全透明。 我可以使用当前设置进行此操作吗?我必须怎么做才能解决此问题? 这是我被告知可以使其部分透明的代码: (顺便说一句,我正在使用png图像) 这是您的sscce(它们都在不同的类中,但是为了简单起见

  • 我目前正在尝试制作一个画布,我可以绘制的东西,并使它出现在一个JFrame。 为此,我打算在一个JPanel组件中有一个BufferedImage,paintComponent方法可以从中进行绘制。 理想情况下,我希望能够从给定的JFrame中引用这个缓冲图像,然后使用其Graphics2D向其绘制素材,paintComponent方法可以在使用缓冲图像绘制时显示这些素材。 我这样做是为了避免直接

  • 简短版本:是否可以(通过Graphics2D)绘制到自定义缓冲区类(“稀疏”光栅图像)? 更长的版本:我想将多边形(由闭合路径给定)转换为光栅图像。 但是由于多边形可能非常大(这是一个研究项目),我必须使用稀疏存储(项目的这部分已经由我之前的人实现了) 由于实现(高效)光栅算法非常耗时,我想使用java已经提供的方法(例如Graphics2D),而不是绘制到BufferedImage中,尝试绘制到

  • 问题内容: 我将签名图像另存为.jpg图片。我使用graphic2d在图像上绘制签名的每个像素(使用签名板获得),它可以正常工作,但我总是得到白色背景。如果我想将签名放在PDF文档上,jpg图像的白色正方形的边框会覆盖PDF的某些单词。 我想要得到的是保存带有透明背景的jpg图像,因此当我将其放置在PDF上时,没有单词被白色图像背景覆盖,只有签名行。 这是保存缓冲图像的代码。它具有白色背景。 我试

  • 导语 在前面一节中,讲述了如何实现简单的涂鸦板,这一次我们将实现在涂鸦板上绘制图形,这里以矩形为例进行讲解。在后面还会提出双缓冲绘图的概念。 环境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2 目录 一、绘制矩形 二、双缓冲绘图 正文 一、绘制矩形 1.我们仍然在前面程序的基础上进行修改,先更改painEvent()函数: void Dialog::paintEven