我在相机胶卷中有一张图像。如果图像和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校验和。
答案 0 :(得分:1)
Assets-Libray在某些情况下将元数据添加到图像中。我观察到,对于JPEG文件,Assets-Library添加了一个JFIF元数据字典(如果尚未存在)。这将导致文件大小增加,MD5-Check失败。 使用Assets-Library无法阻止这种情况发生。
但是,如果您只是在应用中使用JPEG,可能会有一种解决方法来实现您的目标。
1)导入之前使用ImageIO提取嵌入的缩略图图像并为其生成校验和。
2)导入后,从Assets-Library读取第一个128KB(或64KB也可能),然后使用imageIO再次提取缩略图。然后生成缩略图的校验和。如果校验和匹配,则它应该是相同的图像。
答案 1 :(得分:0)
我不相信有一种可靠的方法可以做到这一点。当我尝试使用图库来保存透明的PNG时,如果PNG是通过电子邮件批量存储的,则它们会被iOS转换为jpegs。然后我尝试使用iCloud,但没有成功保留PNG原始格式。如果您正在寻找一些常量,请尝试从URL中提取ID。然后,至少你知道你正在使用相同的东西,即使数据可能会被更改。