Java 重复加载同一图像并将其保存到文件系统会改变图像的数据
重复地从文件系统保存和加载相同的图像会导致数据的更改,从而导致哈希和的更改(我需要) 我的程序执行以下步骤: 1。创建缓冲区映像Java 重复加载同一图像并将其保存到文件系统会改变图像的数据,java,bufferedimage,Java,Bufferedimage,重复地从文件系统保存和加载相同的图像会导致数据的更改,从而导致哈希和的更改(我需要) 我的程序执行以下步骤: 1。创建缓冲区映像 BufferedImage bufferedImage = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = bufferedImage.createGraphics(); graphics.setColor(Color.RED); graphics.fillR
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();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", baos);
byte[] bytesOfImage = baos.toByteArray();
DigestUtils.md5Hex(bytesOfImage); // => bebc7da469524057926f3871bdb07a6a
byte[] bytesOfFile = Files.readAllBytes(tempFile);
DigestUtils.md5Hex(bytesOfFile); // => bebc7da469524057926f3871bdb07a6a
byte[] bytesOfFile2 = Files.readAllBytes(tempFile2);
DigestUtils.md5Hex(bytesOfFile2);// => 11dc0e49342a1ad15ab1b5a7f8bc271e
2。计算创建的BuffereImage的MD5哈希值
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();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", baos);
byte[] bytesOfImage = baos.toByteArray();
DigestUtils.md5Hex(bytesOfImage); // => bebc7da469524057926f3871bdb07a6a
byte[] bytesOfFile = Files.readAllBytes(tempFile);
DigestUtils.md5Hex(bytesOfFile); // => bebc7da469524057926f3871bdb07a6a
byte[] bytesOfFile2 = Files.readAllBytes(tempFile2);
DigestUtils.md5Hex(bytesOfFile2);// => 11dc0e49342a1ad15ab1b5a7f8bc271e
3。将BuffereImage保存到文件系统
Path tempFile = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImage, "jpg", tempFile.toFile());
BufferedImage bufferedImageFromFilesystem = ImageIO.read(tempFile.toFile());
ByteArrayOutputStream baosFS = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem, "jpg", baosFS);
byte[] bytesOfImageFromFilesystem = baosFS.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem); // => 11dc0e49342a1ad15ab1b5a7f8bc271e
Path tempFile2 = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImageFromFilesystem, "jpg", tempFile2.toFile());
BufferedImage bufferedImageFromFilesystem2 = ImageIO.read(tempFile2.toFile());
ByteArrayOutputStream baosFS2 = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem2, "jpg", baosFS2);
byte[] bytesOfImageFromFilesystem2 = baosFS2.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem2); // => d1102e4b7efef384623cac915a21e1c2
4。正在计算文件的MD5哈希值
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();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", baos);
byte[] bytesOfImage = baos.toByteArray();
DigestUtils.md5Hex(bytesOfImage); // => bebc7da469524057926f3871bdb07a6a
byte[] bytesOfFile = Files.readAllBytes(tempFile);
DigestUtils.md5Hex(bytesOfFile); // => bebc7da469524057926f3871bdb07a6a
byte[] bytesOfFile2 = Files.readAllBytes(tempFile2);
DigestUtils.md5Hex(bytesOfFile2);// => 11dc0e49342a1ad15ab1b5a7f8bc271e
5。从文件系统加载图像
Path tempFile = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImage, "jpg", tempFile.toFile());
BufferedImage bufferedImageFromFilesystem = ImageIO.read(tempFile.toFile());
ByteArrayOutputStream baosFS = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem, "jpg", baosFS);
byte[] bytesOfImageFromFilesystem = baosFS.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem); // => 11dc0e49342a1ad15ab1b5a7f8bc271e
Path tempFile2 = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImageFromFilesystem, "jpg", tempFile2.toFile());
BufferedImage bufferedImageFromFilesystem2 = ImageIO.read(tempFile2.toFile());
ByteArrayOutputStream baosFS2 = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem2, "jpg", baosFS2);
byte[] bytesOfImageFromFilesystem2 = baosFS2.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem2); // => d1102e4b7efef384623cac915a21e1c2
6。计算从文件系统加载的图像的MD5哈希值
Path tempFile = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImage, "jpg", tempFile.toFile());
BufferedImage bufferedImageFromFilesystem = ImageIO.read(tempFile.toFile());
ByteArrayOutputStream baosFS = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem, "jpg", baosFS);
byte[] bytesOfImageFromFilesystem = baosFS.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem); // => 11dc0e49342a1ad15ab1b5a7f8bc271e
Path tempFile2 = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImageFromFilesystem, "jpg", tempFile2.toFile());
BufferedImage bufferedImageFromFilesystem2 = ImageIO.read(tempFile2.toFile());
ByteArrayOutputStream baosFS2 = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem2, "jpg", baosFS2);
byte[] bytesOfImageFromFilesystem2 = baosFS2.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem2); // => d1102e4b7efef384623cac915a21e1c2
(重复步骤3至6,但重复使用步骤5中的图像:)7。将缓冲区映像存储到文件系统
Path tempFile = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImage, "jpg", tempFile.toFile());
BufferedImage bufferedImageFromFilesystem = ImageIO.read(tempFile.toFile());
ByteArrayOutputStream baosFS = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem, "jpg", baosFS);
byte[] bytesOfImageFromFilesystem = baosFS.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem); // => 11dc0e49342a1ad15ab1b5a7f8bc271e
Path tempFile2 = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImageFromFilesystem, "jpg", tempFile2.toFile());
BufferedImage bufferedImageFromFilesystem2 = ImageIO.read(tempFile2.toFile());
ByteArrayOutputStream baosFS2 = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem2, "jpg", baosFS2);
byte[] bytesOfImageFromFilesystem2 = baosFS2.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem2); // => d1102e4b7efef384623cac915a21e1c2
8。计算文件的MD5哈希值
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();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", baos);
byte[] bytesOfImage = baos.toByteArray();
DigestUtils.md5Hex(bytesOfImage); // => bebc7da469524057926f3871bdb07a6a
byte[] bytesOfFile = Files.readAllBytes(tempFile);
DigestUtils.md5Hex(bytesOfFile); // => bebc7da469524057926f3871bdb07a6a
byte[] bytesOfFile2 = Files.readAllBytes(tempFile2);
DigestUtils.md5Hex(bytesOfFile2);// => 11dc0e49342a1ad15ab1b5a7f8bc271e
9。从文件系统加载图像
Path tempFile = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImage, "jpg", tempFile.toFile());
BufferedImage bufferedImageFromFilesystem = ImageIO.read(tempFile.toFile());
ByteArrayOutputStream baosFS = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem, "jpg", baosFS);
byte[] bytesOfImageFromFilesystem = baosFS.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem); // => 11dc0e49342a1ad15ab1b5a7f8bc271e
Path tempFile2 = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImageFromFilesystem, "jpg", tempFile2.toFile());
BufferedImage bufferedImageFromFilesystem2 = ImageIO.read(tempFile2.toFile());
ByteArrayOutputStream baosFS2 = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem2, "jpg", baosFS2);
byte[] bytesOfImageFromFilesystem2 = baosFS2.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem2); // => d1102e4b7efef384623cac915a21e1c2
10。计算从文件系统加载的图像的MD5哈希值
Path tempFile = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImage, "jpg", tempFile.toFile());
BufferedImage bufferedImageFromFilesystem = ImageIO.read(tempFile.toFile());
ByteArrayOutputStream baosFS = new ByteArrayOutputStream();
ImageIO.write(bufferedImageFromFilesystem, "jpg", baosFS);
byte[] bytesOfImageFromFilesystem = baosFS.toByteArray();
DigestUtils.md5Hex(bytesOfImageFromFilesystem); // => 11dc0e49342a1ad15ab1b5a7f8bc271e
Path tempFile2 = Files.createTempFile(null, "jpg");
ImageIO.write(bufferedImageFromFilesystem, "jpg", tempFile2.toFile());
BufferedImage bufferedImageFromFilesystem2 = ImageIO.read(tempFile2.toFile());
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.加载相同的图像时,图像数据都会发生更改。图像的大小缩小了几个字节。图像仍然可以由标准windows图像查看器打开,并且似乎仍然有效
我已经检查了这个问题是否是由图像的元数据引起的。将jpg文件的元数据与适当的程序进行比较,不会显示元数据的任何差异
如何确保加载和保存相同的图像不会更改文件?您保存的是jpeg,它是一种有损压缩图像格式,而不是原始缓冲区。有损意味着过程无法逆转,因为信息在过程中丢失。将其保存为jpeg使用启发式压缩字节数组以减小其大小。因此,当您重新加载它时,它会导致与原始数组不同的字节数组,因此更改了哈希。然后再次保存它,这会再次压缩它,从而在加载它时再次导致另一个散列。我怀疑如果你这样做一百万次,图像将变成一个单一的灰色像素,散列将停止改变。你正在保存一个jpeg,这是一种有损压缩图像格式,而不是原始缓冲区。有损意味着过程无法逆转,因为信息在过程中丢失。将其保存为jpeg使用启发式压缩字节数组以减小其大小。因此,当您重新加载它时,它会导致与原始数组不同的字节数组,因此更改了哈希。然后再次保存它,这会再次压缩它,从而在加载它时再次导致另一个散列。我怀疑如果你这样做一百万次,图像将变成一个灰色像素,散列将停止更改。我错过了你反复保存和加载同一图像的地方。您似乎正在重新创建图像。否则,这是个好问题。@GilbertLeBlanc谢谢你的建议。我已经添加了额外的代码(4个步骤)来进一步澄清这个问题。我错过了您反复保存和加载同一图像的地方。您似乎正在重新创建图像。否则,这是个好问题。@GilbertLeBlanc谢谢你的建议。我添加了额外的代码(4个步骤)来进一步澄清这个问题。我认为JPEG的重要之处在于它是一种有损压缩。每次重新压缩图像时,都会丢失数据。一般来说,这不是压缩的问题(即,你可以使用Zip或Flate重新压缩任意次数,并保留相同的数据),只是用于有损压缩方案。谢谢,我脑子里有这个想法,但在回答中没有清楚地表达出来。我更新了它以反映这一重要事实。谢谢你回答我的问题。最初我认为使用ImageIO.write或使用质量因子为1.0的JPGWriter不会进一步压缩我的图像。我认为JPEG的重要之处在于它是一种有损压缩。每次重新压缩图像时,都会丢失数据。一般来说,这不是压缩的问题(即,你可以使用Zip或Flate重新压缩任意次数,并保留相同的数据),只是用于有损压缩方案。谢谢,我脑子里有这个想法,但在回答中没有清楚地表达出来。我更新了它以反映这一重要事实。谢谢你回答我的问题。最初我认为使用ImageIO.write或使用质量因子为1.0的JPGWriter不会进一步压缩我的图像。