您要保存的是jpeg(这是一种压缩图像格式),而不是原始缓冲区。将其另存为jpeg会压缩字节数组以减小其大小。因此,当您将其加载回时,它会导致与原始字节数组不同,从而更改了哈希值。然后,再次保存它,再次压缩它,并在加载时再次导致不同的哈希。我怀疑如果您执行此操作一百万次,则图像将变为单个灰色像素,并且哈希值将停止更改。
反复从文件系统中保存和加载相同的图像会导致数据更改,从而导致哈希值更改(我需要)。
我的程序执行以下步骤:
1。创建一个BufferedImage
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哈希值]]
的代码加载相同的图像时,图像数据都会被更改。图像的大小缩小了几个字节。该图像仍可以通过标准的Windows图像查看器打开,并且似乎仍然有效。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文件的元数据与适当的程序进行比较不会显示出元数据的任何差异。
如何确保加载和保存相同的图像不会更改文件?
反复从文件系统中保存和加载相同的图像会导致数据更改,并因此导致哈希值更改(我需要)。我的程序执行以下步骤:1.创建一个...
您要保存的是jpeg(这是一种压缩图像格式),而不是原始缓冲区。将其另存为jpeg会压缩字节数组以减小其大小。因此,当您将其加载回时,它会导致与原始字节数组不同,从而更改了哈希值。然后,再次保存它,再次压缩它,并在加载时再次导致不同的哈希。我怀疑如果您执行此操作一百万次,则图像将变为单个灰色像素,并且哈希值将停止更改。
您要保存的是jpeg(这是一种压缩图像格式),而不是原始缓冲区。将其另存为jpeg会压缩字节数组以减小其大小。因此,当您将其加载回时,它会导致与原始字节数组不同,从而更改了哈希值。然后,再次保存它,再次压缩它,并在加载时再次导致不同的哈希。我怀疑如果您执行此操作一百万次,则图像将变为单个灰色像素,并且哈希值将停止更改。