ImageIO
是 Java Development Kit (JDK) 中的一个重要工具库,主要用于处理图像的读取、写入和转换。它位于 javax.imageio
包中,提供了丰富的功能来操作各种图像格式。
核心概念
-
图像读取器(ImageReader)
- 负责从文件或其他输入源读取图像数据。
ImageIO
提供了多种读取器来支持不同的图像格式(如 JPEG、PNG、GIF 等)。
-
图像写入器(ImageWriter)
- 负责将图像数据写入文件或其他输出目标。
- 支持多种格式的图像输出。
-
图像流(ImageInputStream / ImageOutputStream)
- 提供了对图像数据的输入和输出流支持。
- 用于处理图像数据的读写操作。
-
图像元数据(IIOMetadata)
- 包含了图像的元数据信息(如分辨率、颜色空间等)。
- 可以通过
ImageIO
获取和修改这些信息。
-
插件(SPI - Service Provider Interface)
ImageIO
使用插件机制来支持不同的图像格式。- 开发者可以通过实现插件来扩展
ImageIO
的功能。
常用函数及示例
1. 读取图像
函数:
BufferedImage read(File input) BufferedImage read(ImageInputStream stream)
java运行
- 1
- 2
示例:
import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class ImageReadExample { public static void main(String[] args) { try { // 从文件中读取图像 File input = new File("example.jpg"); BufferedImage image = ImageIO.read(input); // 输出图像信息 System.out.println("Width: " + image.getWidth()); System.out.println("Height: " + image.getHeight()); } catch (IOException e) { e.printStackTrace(); } } }
java运行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
2. 写入图像
函数:
boolean write(RenderedImage im, String formatName, File output) boolean write(RenderedImage im, String formatName, OutputStream output)
java运行
- 1
- 2
示例:
import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class ImageWriteExample { public static void main(String[] args) { try { // 创建一个简单的图像 BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB); // 假设对图像进行了绘制操作... // 将图像保存为 PNG 格式 File output = new File("output.png"); ImageIO.write(image, "png", output); System.out.println("Image saved successfully!"); } catch (IOException e) { e.printStackTrace(); } } }
java运行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
3. 获取支持的格式
函数:
String[] getReaderFormatNames() String[] getWriterFormatNames()
java运行
- 1
- 2
示例:
import javax.imageio.ImageIO; public class ImageFormatExample { public static void main(String[] args) { // 获取支持的读取格式 String[] readerFormats = ImageIO.getReaderFormatNames(); System.out.println("Supported reader formats:"); for (String format : readerFormats) { System.out.println(format); } // 获取支持的写入格式 String[] writerFormats = ImageIO.getWriterFormatNames(); System.out.println("Supported writer formats:"); for (String format : writerFormats) { System.out.println(format); } } }
java运行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
4. 使用 ImageInputStream 和 ImageOutputStream
函数:
ImageInputStream createImageInputStream(Object input) ImageOutputStream createImageOutputStream(Object output)
java运行
- 1
- 2
示例:
import javax.imageio.ImageIO; import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageOutputStream; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class ImageStreamExample { public static void main(String[] args) { try { // 创建 ImageInputStream File input = new File("example.jpg"); ImageInputStream iis = ImageIO.createImageInputStream(input); // 读取图像 BufferedImage image = ImageIO.read(iis); // 创建 ImageOutputStream File output = new File("output.jpg"); ImageOutputStream ios = ImageIO.createImageOutputStream(output); // 写入图像 ImageIO.write(image, "jpg", ios); // 关闭流 iis.close(); ios.close(); } catch (IOException e) { e.printStackTrace(); } } }
java运行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
5. 获取图像元数据
函数:
IIOMetadata getMetadata(int imageIndex)
java运行
- 1
示例:
import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.metadata.IIOMetadata; import javax.imageio.stream.ImageInputStream; import java.io.File; import java.io.IOException; import java.util.Iterator; public class ImageMetadataExample { public static void main(String[] args) { try { // 打开图像文件 File input = new File("example.jpg"); ImageInputStream iis = ImageIO.createImageInputStream(input); // 获取图像读取器 Iterator<ImageReader> readers = ImageIO.getImageReaders(iis); if (readers.hasNext()) { ImageReader reader = readers.next(); reader.setInput(iis); // 获取元数据 IIOMetadata metadata = reader.getImageMetadata(0); // 输出元数据信息 System.out.println(metadata.getMetadataFormatNames()[0]); } } catch (IOException e) { e.printStackTrace(); } } }
java运行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
总结
ImageIO
是一个功能强大的图像处理库,提供了丰富的接口和方法来读取、写入、转换和处理图像。通过上述示例,你可以看到如何使用 ImageIO
来完成常见的图像操作任务。当然,ImageIO
的功能远不止这些,它还支持更复杂的图像处理,如图像的缩放、旋转、裁剪等,以及对图像元数据的详细操作。如果你需要更深入的学习,可以参考 Java 官方文档或相关书籍,进一步探索 ImageIO
的高级用法。