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

Posted

技术标签:

【中文标题】使用 writeImageDataToSavedPhotosAlbum 保存图像会修改实际图像数据【英文标题】:saving image using writeImageDataToSavedPhotosAlbum modifies the actual image data 【发布时间】:2012-09-27 14:01:16 【问题描述】:

我的相机胶卷中有一张图片。如果图像和 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 校验和。

【问题讨论】:

【参考方案1】:

Assets-Libray 在某些情况下会向图像添加元数据。我观察到,对于 JPEG 文件,Assets-Library 添加了一个 JFIF 元数据字典(如果还没有的话)。这将导致文件变大并且 MD5-Check 失败。 使用 Assets-Library 无法防止这种情况发生。

但是,如果您只在应用中使用 JPEG,则可能有一种解决方法可以实现您想要的效果。

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

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

【讨论】:

这几乎是我采取的措施。将图像写回库后,在完成处理程序中,我获得了对图像的新引用,并再次 md5。我正在 md5-ing 文件的第一个 MB。使用 md5 的缩略图一点也不坏,我将不得不在下一次更新时对其进行测试。【参考方案2】:

我不相信有可靠的方法来做到这一点。当我尝试使用图库保存透明的 PNG 时,如果 PNG 是从电子邮件中批量存储的,它们会被 iOS 转换为 jpeg。然后我尝试使用 iCloud,但没有成功保存 PNG 的原始格式。如果您正在寻找不变的东西,请尝试从 URL 中提取 id。那么至少你知道你在处理同样的事情,即使数据可能会改变。

【讨论】:

以上是关于使用 writeImageDataToSavedPhotosAlbum 保存图像会修改实际图像数据的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)