# 写/保存图像

> 原文： [https://docs.oracle.com/javase/tutorial/https://docs.oracle.com/javase/tutorial/images/saveimage.html](https://docs.oracle.com/javase/tutorial/https://docs.oracle.com/javase/tutorial/images/saveimage.html)

本课程首先介绍如何使用`javax.imageio`包将外部图像格式的图像加载到 Java 2D 使用的内部 `BufferedImage` 格式中。然后介绍如何使用`Graphics.drawImage()`绘制该图像，并使用可选的过滤功能。

最后阶段是将`BufferedImage`对象保存为外部图像格式。这可能是最初由`Image I/O`类从外部图像格式加载的图像，也许可能是使用 Java 2D API 修改的，或者它可能是由 Java 2D 创建的图像。

在下面的示例中，`Image I/O`类提供了一种以各种图像格式保存图像的简单方法：

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

```

* * *

**Note:** The `BufferedImage` class implements the `RenderedImage` interface.

* * *

。

`formatName`参数选择保存`BufferedImage`的图像格式。

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

```

`ImageIO.write`方法调用实现 PNG 编写“PNG 编写器插件”的代码。使用术语 _ 插件 _，因为`Image I/O`是可扩展的，并且可以支持多种格式。

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

每种图像格式都有其优点和缺点：

| 格式 | 加 | 减去 |
| --- | --- | --- |
| GIF | 支持动画和透明像素 | 仅支持 256 种颜色，没有半透明度 |
| PNG | 对于高色彩无损图像，比 GIF 或 JPG 更好的替代方案，支持半透明 | 不支持动画 |
| JPG | 非常适合摄影图像 | 压缩丢失，不适用于文本，屏幕截图或必须严格保留原始图像的任何应用程序 |

对于大多数应用程序，使用这些标准插件之一就足够了。它们具有易于获得的优点。 `Image I/O`类提供了一种插入支持可以使用的其他格式的方法，并且存在许多这样的插件。如果您对可以在系统中加载或保存的文件格式感兴趣，可以使用`ImageIO`类的`getReaderFormatNames`和`getWriterFormatNames`方法。这些方法返回一个字符串数组，列出了此 JRE 支持的所有格式。

```
String writerNames[] = ImageIO.getWriterFormatNames();

```

返回的名称数组将包括已安装的任何其他插件，这些名称中的任何一个都可以用作格式名称来选择图像编写器。以下代码示例是完整图像编辑/修饰程序的简单版本，它使用 [`ImageDrawingApplet.java`](examples/ImageDrawingApplet.java) 示例程序的修订版本，可以按如下方式使用：

*   首先通过 Image I / O 加载图像
*   用户从下拉列表中选择过滤器并绘制新的更新图像
*   用户从下拉列表中选择保存格式
*   接下来出现文件选择器，用户选择保存图像的位置
*   现在，其他桌面应用程序可以查看修改后的图像

该示例的完整代码在 [`SaveImage.java`](examples/SaveImage.java) 中表示。

在本课程中，您只学习了`Image I/O`的基础知识，它为编写图像提供了广泛的支持，包括直接使用`ImageWriter`插件来实现对编码过程的更好控制。 ImageIO 可以写入多个图像，图像元数据，并确定质量与尺寸的权衡。有关更多信息，请参阅 [Java Image I / O API 指南](https://docs.oracle.com/javase/8/docs/technotes/guides/imageio/spec/title.fm.html)。