【问题标题】:imageIO making button to save JFrame as PNG将 JFrame 保存为 PNG 的 imageIO 制作按钮
【发布时间】:2017-05-17 08:15:58
【问题描述】:

我很困惑 imageIO 是如何工作的,我有这个应用程序:

我希望保存按钮将其在 JFrame 中的所有内容保存为 PNG。 但是,当我尝试此代码时,它不起作用:

ImageIO.write(JFrame, "PNG", new File("filename.png"));

有回复吗?

【问题讨论】:

    标签: java swing jframe javax.imageio


    【解决方案1】:

    根据JavaDocs,您需要将ImageIO.write 传递给RenderedImage 的实例。

    如果您查看JavaDocs for JFrame,您会发现它没有实现RenderedImage,因此您的问题。

    如果您看一下 any example of Image.write,您会发现几乎总是使用 BufferedImage,因为它与 JFrame 不同,确实实现了 RenderedImage

    好的,所以问题变成了,“我如何将JFrame 绘制成BufferedImage?”

    如果你环顾四周,答案很简单。

    BufferedImage img = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = img.createGraphics();
    frame.printAll(g2d);
    g2d.dispose();
    

    现在,你可以保存它了...

    ImageIO.write(img, "png", new File("filename.png"));
    

    【讨论】:

    • 我是将bufferedImage代码添加到保存按钮还是整个JFrame?
    • 这取决于您要保存图像的时间
    • 我想在点击保存按钮时保存图片,你能告诉我把代码放在哪里吗?
    • 把代码放在需要用到的地方。在保存之前拍摄帧的快照是没有意义的
    • @MadProgrammer,终于看到了使用 printAll() 而不是 paint() 的具体原因。 (双缓冲似乎不是问题,因为性能仍然相同)。在 Windows 上,当使用 paint() 时,框架的标题栏和边框都是黑色的。使用 printAll() 我确实得到了一个标题栏和边框,但是,它看起来更像 Metal 标题栏和边框,而不是 Windows LAF。因此,至少在 Windows 上,获得正确标题栏和边框图像的唯一方法似乎仍然是使用机器人。
    【解决方案2】:

    查看Screen Image 类。

    它提供重载方法来绘制组件或组件的一部分。然后逻辑将使用:

    1. 用于绘制框架的 Robot 类,或
    2. Swing 绘制以绘制 Swing 组件。 (绘画比使用机器人更有效率)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多