重复加载并将同一图像保存到文件系统会改变图像的数据



从文件系统重复保存和加载相同的映像会导致数据更改,从而导致哈希和更改(我需要(。

我的程序执行以下步骤:

1.创建缓冲图像

BufferedImage bufferedImage = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = bufferedImage.createGraphics();
graphics.setColor(Color.RED);
graphics.fillRect(100, 100, 200, 200);
graphics.dispose();

2.计算创建的BufferedImage的MD5哈希

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", baos);
byte[] bytesOfImage = baos.toByteArray();
DigestUtils.md5Hex(bytesOfImage); // => bebc7da469524057926f3871bdb07a6a

3.将BufferedImage保存到文件系统

Path tempFile = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImage, "jpg", tempFile.toFile());

4.计算文件的MD5哈希

byte[] bytesOfFile = Files.readAllBytes(tempFile);
DigestUtils.md5Hex(bytesOfFile); // => bebc7da469524057926f3871bdb07a6a

5.从文件系统加载图像

BufferedImage bufferedImageFromFilesystem = ImageIO.read(tempFile.toFile());

6.计算从文件系统加载的图像的MD5哈希

ByteArrayOutputStream baosFS = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem, "jpg", baosFS);
byte[] bytesOfImageFromFilesystem = baosFS.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem); // => 11dc0e49342a1ad15ab1b5a7f8bc271e

(重复步骤3至6,但重复使用步骤5中的图像:(
7。将BufferedImage存储到文件系统

Path tempFile2 = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImageFromFilesystem, "jpg", tempFile2.toFile());

8.计算文件的MD5哈希

byte[] bytesOfFile2 = Files.readAllBytes(tempFile2);
DigestUtils.md5Hex(bytesOfFile2);// => 11dc0e49342a1ad15ab1b5a7f8bc271e

9.从文件系统加载图像

BufferedImage bufferedImageFromFilesystem2 = ImageIO.read(tempFile2.toFile());

10.计算从文件系统加载的图像的MD5哈希

ByteArrayOutputStream baosFS2 = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem2, "jpg", baosFS2);
byte[] bytesOfImageFromFilesystem2 = baosFS2.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem2); // => d1102e4b7efef384623cac915a21e1c2

(org.apache.commons.codec.digest.DigestUtils用于MD5计算(

每次我使用代码片段#3.在文件系统上保存相同的图像,并使用文件系统中的代码片段#5.

我已经检查了问题是否是由图像的元数据引起的。将jpg文件的元数据与适当的程序进行比较不会显示元数据的任何差异。

如何确保加载和保存相同的图像不会更改文件?

您保存的是jpeg,这是一种有损压缩图像格式,而不是原始缓冲区。Lossy是指由于信息在过程中丢失,过程无法逆转。将其保存为jpeg使用启发式方法来压缩字节数组,以减小其大小。因此,当您将其加载回时,会产生与原始字节数组不同的字节数组,从而更改哈希。然后你再次保存它,这会再次压缩它,当你加载它时,会再次导致一个不同的哈希。我怀疑,如果你这样做一百万次,图像就会变成一个灰色像素,哈希就会停止变化。

最新更新