写入/保存图像
本课以使用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
类实现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 writer 插件”。使用“插件”一词是因为Image I/O
是可扩展的,并且可以支持多种格式。
但是始终存在以下标准图像格式插件:JPEG,PNG,GIF,BMP 和 WBMP。
每种图像格式都有其优点和缺点:
Format | Plus | Minus |
---|---|---|
GIF | 支持动画和透明像素 | 仅支持 256 色且不透明 |
PNG | 对于高彩色无损图像,比 GIF 或 JPG 更好的选择,支持半透明 | 不支持动画 |
JPG | 非常适合摄影图像 | 压缩丢失,不利于文本,屏幕截图或必须精确保留原始图像的任何应用程序 |
对于大多数应用程序,使用这些标准插件之一就足够了。它们具有随时可用的优势。 Image I/O
类提供了一种插入对其他可用格式的支持的方式,并且存在许多此类插件。如果您对可以在系统中加载或保存哪些文件格式感兴趣,可以使用ImageIO
类的getReaderFormatNames
和getWriterFormatNames
方法。这些方法返回一个字符串 数组,列出此 JRE 支持的所有格式。
String writerNames[] = ImageIO.getWriterFormatNames();
返回的名称数组将包括已安装的所有其他插件,并且这些名称中的任何一个都可以用作选择图像编写器的格式名称。以下代码示例是完整图像编辑/修饰程序的简单版本,该程序使用ImageDrawingApplet.java示例程序的修订版,该版本可以按以下方式使用:
-
首先通过映像 I/O 加载映像
-
用户从下拉列表中选择一个过滤器,然后绘制新的更新图像
-
用户从下拉列表中选择一种保存格式
-
接下来,出现一个文件 selectors,用户选择保存图像的位置
-
现在,其他桌面应用程序可以查看修改后的图像
此示例的完整代码在SaveImage.java中表示。
在本类中,您仅学习了Image I/O
的基础知识,它为编写图像提供了广泛的支持,包括直接使用ImageWriter
插件来实现对编码过程的更好控制。 ImageIO 可以写入多个图像,图像元数据,并确定质量与尺寸的权衡。有关更多信息,请参见Java Image I/O API 指南。