写/保存图像

原文: 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类提供了一种以各种图像格式保存图像的简单方法:

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

Note: The BufferedImage class implements the RenderedImage interface.


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

  1. try {
  2. // retrieve image
  3. BufferedImage bi = getMyImage();
  4. File outputfile = new File("saved.png");
  5. ImageIO.write(bi, "png", outputfile);
  6. } catch (IOException e) {
  7. ...
  8. }

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

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

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

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

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

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

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

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

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

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