Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重复加载同一图像并将其保存到文件系统会改变图像的数据_Java_Bufferedimage - Fatal编程技术网

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

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

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

我的程序执行以下步骤:

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();
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不会进一步压缩我的图像。