ChatGPT解决这个技术问题 Extra ChatGPT

如何将 BufferedImage 保存为文件

我正在使用 imgscalr Java 库来调整图像大小。

resize() 方法调用的结果是一个 BufferedImage 对象。我现在想将其保存为文件(通常为 .jpg)。

我怎样才能做到这一点?我想从 BufferedImage -> File 但也许这不是正确的方法?


W
Werner Kvalem Vesterås
File outputfile = new File("image.jpg");
ImageIO.write(bufferedImage, "jpg", outputfile);

另外,请确保 outputfile 存在。如果没有, write() 将(错误地)抛出 NullPointerException
用 try/catch 包围。
不要抓住 NullPointerException,使用 if (outputfile.exists())
C
Community

答案在 Java 文档的 Tutorial for Writing/Saving an Image 中。

Image I/O 类提供以下保存图像的方法:

static boolean ImageIO.write(RenderedImage im, String formatName, File output)  throws IOException

本教程解释说

BufferedImage 类实现了 RenderedImage 接口。

所以它可以在方法中使用。

例如,

try {
    BufferedImage bi = getMyImage();  // retrieve image
    File outputfile = new File("saved.png");
    ImageIO.write(bi, "png", outputfile);
} catch (IOException e) {
    // handle exception
}

try block 包围 write 调用很重要,因为根据 the API,如果在写入期间发生错误,该方法会抛出 IOException

还更详细地解释了方法的目标、参数、返回和抛出:

使用支持给定格式的任意 ImageWriter 将图像写入文件。如果已经存在 File,则丢弃其内容。参数: im - 要写入的 RenderedImage。 formatName - 一个包含格式的非正式名称的字符串。 output - 要写入的文件。返回:如果没有找到合适的 writer,则返回 false。抛出: IllegalArgumentException - 如果任何参数为空。 IOException - 如果在写入过程中发生错误。

然而,formatName 可能看起来仍然相当模糊和模棱两可;本教程将其清除了一点:

ImageIO.write 方法调用实现PNG 的代码编写“PNG 编写器插件”。使用术语插件是因为 Image I/O 是可扩展的并且可以支持多种格式。但以下标准图像格式插件:JPEG、PNG、GIF、BMP 和 WBMP 始终存在。对于大多数应用程序,使用这些标准插件之一就足够了。它们的优点是随时可用。

但是,您可以使用其他格式:

Image I/O 类提供了一种插入支持其他可用格式的方法,并且存在许多这样的插件。如果您对可以在系统中加载或保存哪些文件格式感兴趣,可以使用 ImageIO 类的 getReaderFormatNames 和 getWriterFormatNames 方法。这些方法返回一个字符串数组,列出此 JRE 支持的所有格式。字符串 writerNames[] = ImageIO.getWriterFormatNames();返回的名称数组将包括已安装的任何其他插件,并且这些名称中的任何一个都可以用作格式名称来选择图像编写器。

有关完整且实用的示例,可以参考 Oracle 的 SaveImage.java example.


M
Matthieu

您可以使用 javax.imageio.ImageIO 类的 write 方法保存 BufferedImage 对象。该方法的签名是这样的:

public static boolean write(RenderedImage im, String formatName, File output) throws IOException

这里 im 是要写入的 RenderedImageformatName 是包含格式的非正式名称(例如 png)的字符串,而 output 是要写入的文件对象。 PNG文件格式的方法的示例用法如下所示:

ImageIO.write(image, "png", file);

E
Eric Leschinski

创建 java.awt.image.bufferedImage 并将其保存到文件:

import java.io.*;
import java.awt.image.*;
import javax.imageio.*;
public class Main{
    public static void main(String args[]){
        try{
            BufferedImage img = new BufferedImage( 
                500, 500, BufferedImage.TYPE_INT_RGB );

            File f = new File("MyFile.png");
            int r = 5;
            int g = 25;
            int b = 255;
            int col = (r << 16) | (g << 8) | b;
            for(int x = 0; x < 500; x++){
                for(int y = 20; y < 300; y++){
                    img.setRGB(x, y, col);
                }
            }
            ImageIO.write(img, "PNG", f);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

笔记:

创建一个名为 MyFile.png 的文件。图像为 500 x 500 像素。覆盖现有文件。图像的颜色为黑色,顶部有一条蓝色条纹。


这是一个非常好的自包含示例。
Z
Zon

下载 imgscalr-lib-xxjar 和 imgscalr-lib-xx-javadoc.jar 并将其添加到您的项目库中。在您的代码中: import static org.imgscalr.Scalr.*; public static BufferedImage resizeBufferedImage(BufferedImage image, Scalr.Method scalrMethod, Scalr.Mode scalrMode, int width, int height) { BufferedImage bi = image; bi = 调整大小(图像,scalrMethod,scalrMode,宽度,高度);返回双; } // 保存图片:ImageIO.write(Scalr.resize(etotBImage, 150), "jpg", new File(myDir));


E
Eric Leschinski

作为一个班轮:

ImageIO.write(Scalr.resize(ImageIO.read(...), 150));

标量无法解释。