如何将BufferedImage保存为文件


125

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

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

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

Answers:


238
File outputfile = new File("image.jpg");
ImageIO.write(bufferedImage, "jpg", outputfile);

7
另外,请确保存在outputfile。如果不是,write()将(错误地)引发NullPointerException
Cody S

9
用try / catch包围。
Lou Morda 2014年

别捉拿NullPointerException,使用if (outputfile.exists())

24

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

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

imRenderedImage要写入的,formatName是包含格式的非正式名称(例如png)的String,并且output是要写入的文件对象。PNG文件格式方法的用法示例如下所示:

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

20

答案就在Java文档的“编写/保存图像”教程中

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
}

writetry块包围调用很重要,因为根据API,该方法将引发IOException“如果在写入过程中发生错误”

还详细说明了该方法的目标,参数,返回值和引发:

使用支持给定格式的任意ImageWriter将图像写入File。如果已经存在文件,则将其内容丢弃。

参数:

im-要写入的RenderedImage。

formatName-一个字符串,包含格式的非正式名称。

输出-要写入的文件。

返回值:

如果找不到合适的作者,则返回false。

抛出:

IllegalArgumentException-如果任何参数为null。

IOException-如果在写入过程中发生错误。

但是,formatName可能看起来仍然比较模糊和模棱两可。本教程将其清除了一点:

ImageIO.write方法调用编写PNG编写器插件的实现PNG的代码。之所以使用“插件”一词,是因为映像I / O是可扩展的,并且可以支持多种格式。

但是始终存在以下标准图像格式插件:JPEG,PNG,GIF,BMP和WBMP。

对于大多数应用程序来说,使用这些标准插件之一就足够了。它们具有随时可用的优势。

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

Image I / O类提供了一种插入支持其他可用格式的方式,并且存在许多此类插件。如果您对可用于加载或保存在系统中的文件格式感兴趣,则可以使用ImageIO类的getReaderFormatNames和getWriterFormatNames方法。这些方法返回一个字符串数组,列出了此JRE支持的所有格式。

String writerNames[] = ImageIO.getWriterFormatNames();

返回的名称数组将包括已安装的所有其他插件,并且这些名称中的任何一个都可以用作选择图像编写器的格式名称。

对于一个完整而实际的示例,可以参考Oracle的SaveImage.java示例。


9

创建一个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();
        }
    }
}

笔记:

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

1
  1. 下载imgscalr-lib-xxjarimgscalr-lib-xx-javadoc.jar并将其添加到您的项目库中。
  2. 在您的代码中:

    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 = resize( image, scalrMethod, scalrMode, width, height);
    return bi;
    }
    
    // Save image:
    ImageIO.write(Scalr.resize(etotBImage, 150), "jpg", new File(myDir));
    

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.