使用writeImageDataToSavedPhotosAlbum保存图像修改实际图像数据

我在相机胶卷中有一个图像。 如果图像和md5检查它,我得到数据表示。 我们将图像写入文档目录为img0.jpg删除原始图像并使用ALAssetLibrary的writeImageDataToSavedPhotosAlbum将数据表示写回相机胶卷。

查看相册,图像看起来是一样的。 再次从相机胶卷中读取新保存的图像。

预期结果 – 数学md5。 实际结果 – 不同的md5。

保存此文件以及img2.jpg

Hexdump这两个并看看差异:

Dans-Mac:Desktop dan$ hexdump img1.jpg | head 0000000 ff d8 ff e1 26 31 45 78 69 66 00 00 4d 4d 00 2a 0000010 00 00 00 08 00 05 01 1a 00 05 00 00 00 01 00 00 0000020 00 4a 01 1b 00 05 00 00 00 01 00 00 00 52 01 28 0000030 00 03 00 00 00 01 00 02 00 00 02 13 00 03 00 00 0000040 00 01 00 01 00 00 87 69 00 04 00 00 00 01 00 00 0000050 00 5a 00 00 00 b4 00 00 00 48 00 00 00 01 00 00 0000060 00 48 00 00 00 01 00 07 90 00 00 07 00 00 00 04 0000070 30 32 32 31 91 01 00 07 00 00 00 04 00 00 00 00 0000080 a0 00 00 07 00 00 00 04 30 31 30 30 a0 01 00 03 0000090 00 00 00 01 00 01 00 00 a0 02 00 04 00 00 00 01 Dans-Mac:Desktop dan$ hexdump img2.jpg | head 0000000 ff d8 ff e1 26 31 45 78 69 66 00 00 4d 4d 00 2a 0000010 00 00 00 08 00 05 01 1a 00 05 00 00 00 01 00 00 0000020 00 4a 01 1b 00 05 00 00 00 01 00 00 00 52 01 28 0000030 00 03 00 00 00 01 00 02 00 00 02 13 00 03 00 00 0000040 00 01 00 01 00 00 87 69 00 04 00 00 00 01 00 00 0000050 00 5a 00 00 00 b4 00 00 00 48 00 00 00 01 00 00 0000060 00 48 00 00 00 01 00 07 90 00 00 07 00 00 00 04 0000070 30 32 32 31 91 01 00 07 00 00 00 04 00 00 00 01 0000080 a0 00 00 07 00 00 00 04 30 31 30 30 a0 01 00 03 0000090 00 00 00 01 00 01 00 00 a0 02 00 04 00 00 00 01 

如果您查看0000070行,则最后一个字符会有所不同。 某些图像(大多数)会发生这种情况,但并非所有图像都会发生。 在这种特殊情况下,标题中只有一个字符差异,但测试的其他图像更糟糕,许多数据不同。

在iOS上有没有办法将实际图像数据写入未受污染的照片库? 根据我的应用程序正在做的事情,我将图像保存到照片库后依赖于md5校验和。

我不相信有一种可靠的方法可以做到这一点。 当我尝试使用图库来保存具有透明度的PNG时,如果PNG是通过电子邮件批量存储的,则它们会被iOS转换为jpegs。 然后我尝试使用iCloud但没有成功保留PNG原始格式。 如果您正在寻找一些常量,请尝试从URL中提取ID。 然后,即使数据可能会被更改,至少你知道你正在使用相同的东西。

Assets-Libray在某些情况下将元数据添加到图像中。 我观察到,对于JPEG文件,Assets-Library添加了一个JFIF元数据字典(如果尚未存在)。 这将导致文件大小增加,MD5-Check失败。 使用Assets-Library无法阻止这种情况发生。

但是,如果您只在应用程序中使用JPEG,则可能需要一种解决方法来实现您的目标。

1)导入之前使用ImageIO提取嵌入的缩略图图像并为其生成校验和。

2)导入后,从Assets-Library读取第一个128KB(或64KB也可能),然后使用imageIO再次提取缩略图。 然后生成缩略图的校验和。 如果校验和匹配,则它应该是相同的图像。