写入/保存图像

本课以使用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:

BufferedImage类实现RenderedImageinterface。

.

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 writer 插件”。使用“插件”一词是因为Image I/O是可扩展的,并且可以支持多种格式。

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

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

FormatPlusMinus
GIF支持动画和透明像素仅支持 256 色且不透明
PNG对于高彩色无损图像,比 GIF 或 JPG 更好的选择,支持半透明不支持动画
JPG非常适合摄影图像压缩丢失,不利于文本,屏幕截图或必须精确保留原始图像的任何应用程序

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

String writerNames[] = ImageIO.getWriterFormatNames();

返回的名称数组将包括已安装的所有其他插件,并且这些名称中的任何一个都可以用作选择图像编写器的格式名称。以下代码示例是完整图像编辑/修饰程序的简单版本,该程序使用ImageDrawingApplet.java示例程序的修订版,该版本可以按以下方式使用:

  • 首先通过映像 I/O 加载映像

  • 用户从下拉列表中选择一个过滤器,然后绘制新的更新图像

  • 用户从下拉列表中选择一种保存格式

  • 接下来,出现一个文件 selectors,用户选择保存图像的位置

  • 现在,其他桌面应用程序可以查看修改后的图像

此示例的完整代码在SaveImage.java中表示。

在本类中,您仅学习了Image I/O的基础知识,它为编写图像提供了广泛的支持,包括直接使用ImageWriter插件来实现对编码过程的更好控制。 ImageIO 可以写入多个图像,图像元数据,并确定质量与尺寸的权衡。有关更多信息,请参见Java Image I/O API 指南