Java 中将字节转换为图像

17 Mar 2025 | 4 分钟阅读

字节数组是一种用于存储二进制数据的基本数据结构,使其成为各种任务的通用工具。一个常见的用例是将图像存储在字节数组中。在本节中,我们将探讨如何在 Java 中将字节数组转换为图像。我们将涵盖整个过程,从读取图像文件并生成字节数组到从字节数组创建新的图像文件。

字节数组转图像

如果我们有存储为字节数组的图像信息,您可以从该数组中重建图像。Java 提供了一组类和方法来促进此过程,尤其是在 javax.imageio 包中。

读取图像文件并创建字节数组

  1. 使用 ImageIO.read(new File("Image path")) 从文件读取图像。
  2. 创建 ByteArrayOutputStream 类的实例以存储图像数据。
  3. 使用 ImageIO.write(image, "jpg", outStreamObj) 将图像写入 ByteArrayOutputStream。
  4. 使用 byteArray = outStreamObj.toByteArray() 将图像转换为字节数组。

从字节数组生成新图像文件

  1. 创建 ByteArrayInputStream 类的实例并使用字节数组对其进行初始化。
  2. 使用 ImageIO.read(inStreambj) 从 ByteArrayInputStream 读取图像。
  3. 创建一个新文件并使用 ImageIO.write(newImage, "jpg", new File("outputImage.jpg")) 将图像写入其中。

方法 1:使用 ImageIO

该方法使用 Java 标准库中的 ImageIO 类来读写图像。以下是完整的代码

ByteToImageConverter.java

输出

Convert Byte to an Image in Java
Convert Byte to an Image in Java

解释

在方法 1 中,我们使用 Java 内置的 ImageIO 类将字节数组转换为图像。该方法基于 ImageIO 方法以及 ByteArrayInputStream 和 ByteArrayOutputStream 的组合。以下是其工作原理:

我们首先使用 ImageIO.read(new File("image.jpg")) 从文件读取图像。此方法将图像加载到 BufferedImage 中。

为了将此 BufferedImage 转换为字节数组,我们创建一个 ByteArrayOutputStream。此流充当图像数据的临时存储。接下来,我们使用 ImageIO.write(image, "jpg", outStreamObj) 将图像数据写入 ByteArrayOutputStream。此过程将图像编码为字节数组。我们通过调用 outStreamObj.toByteArray() 来获取字节数组。现在,图像由字节数组表示。为了从字节数组重新创建图像,我们创建一个使用字节数组初始化的 ByteArrayInputStream。此流允许我们读取图像数据。我们使用 ImageIO.read(inStreambj) 从 ByteArrayInputStream 读取图像,从而得到一个新的 BufferedImage。

最后,我们使用 ImageIO.write(newImage, "jpg", new File("outputImageMethod1.jpg")) 将新的 BufferedImage 写入输出文件。此步骤从字节数组生成新的图像文件。

方法 2:使用 javax.imageio.ImageReader 和 ImageWriter

该方法使用特定的 ImageReader 和 ImageWriter 类来读写图像。以下是完整的代码

ByteToImage.java

输出

Convert Byte to an Image in Java
Convert Byte to an Image in Java

解释

方法 2 也利用了 Java 的 javax.imageio 包。它不直接使用 ImageIO,而是使用特定的 ImageReader 和 ImageWriter 类。该过程涉及以下步骤:

我们使用 ImageIO.getImageReadersByFormatName("jpg").next() 从文件读取图像。这会创建一个了解图像格式的 ImageReader。然后我们将图像读入 BufferedImage。

为了将 BufferedImage 转换为字节数组,我们创建一个 ImageOutputStream。我们将此输出流与 ByteArrayOutputStream 关联以存储图像数据。我们使用 ImageWriter 将图像数据写入 ImageOutputStream。

我们从 ByteArrayOutputStream 中检索字节数组。为了从字节数组重新创建图像,我们创建一个 ByteArrayInputStream 并使用字节数组对其进行初始化。

我们使用新的 ImageReader 从 ByteArrayInputStream 读取图像数据,从而得到一个新的 BufferedImage。最后,我们将新的 BufferedImage 写入输出文件,从而从字节数组创建新的图像文件。

结论

在 Java 中将字节数组转换为图像是一项对各种应用程序有价值的技能。借助 javax.imageio 包,我们可以有效地将图像数据转换为字节数组,反之亦然。本节提供了分步指南和完整的 Java 程序来成功执行此转换。