iOS:保存到相机胶卷时保留 JFIF/EXIF 数据

Ste*_*tto 5 exif ios

原问题

我正在尝试将图像保存到相机胶卷中,同时保留所有原始 EXIF/JFIF 数据。我希望保存到相机胶卷的图像与原始文件逐字节相同。当我通过 保存图像时[ALAssetsLibrary writeImageDataToSavedPhotosAlbum:metadata:completionBlock:],原始 EXIF 数据被保留,但 JFIF 被剥离。

ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];
[library writeImageDataToSavedPhotosAlbum:imageData metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
    [self imageDidFinishSavingToCameraRollWithError:error];
}];
Run Code Online (Sandbox Code Playgroud)

我尝试使用iphone-exif项目解析出 JFIF 数据并通过元数据参数显式传递它:

EXFJpeg *jpegScanner = [[EXFJpeg alloc] init];
[jpegScanner scanImageData:imageData];
EXFJFIF *jfif = [jpegScanner jfif];

NSMutableDictionary *jfifMetadata = [[NSMutableDictionary alloc] init];
[jfifMetadata setObject:[jfif version] forKey:(NSString *)kCGImagePropertyJFIFVersion];
...
NSMutableDictionary *metadata = [[NSMutableDictionary alloc] init];
[metadata setObject:jfifMetadata forKey:(NSString*)kCGImagePropertyJFIFDictionary];
Run Code Online (Sandbox Code Playgroud)

但是这样做会产生相同的文件,逐字节传递nil元数据字典,这意味着 JFIF 数据仍在被 iOS 剥离。

根据维基百科

从形式上讲,Exif 和 JFIF 标准是不兼容的。这是因为两者都指定它们的特定应用程序段(JFIF 为 APP0,Exif 为 APP1)必须是图像文件中的第一个。实际上,许多程序和数码相机会生成包含这两个应用程序段的文件。这不会影响大多数解码器的图像解码,但设计不当的 JFIF 或 Exif 解析器可能无法正确识别文件。

有没有办法将原始文件逐字节保存到相机胶卷中,或者如果存在 EXIF,iOS 会始终忽略 JFIF 数据吗?


更新:2/26/13

我已经向<rdar://13291591>苹果提交了申请。我还创建了一个演示该问题的示例项目:http : //spolet.to/3J0l1u3w0R2e

示例应用程序具有三个按钮:一个用于带有 JFIF 数据的 JPEG,一个用于没有 JFIF 数据的 JPEG,一个用于 PNG。当点击按钮时,相应的图像将被散列并保存到照片库中。生成的 ALAsset 也将被散列。

结果:

  • 保存的 PNG 的 ALAsset 与原始文件具有相同的哈希值。
  • 保存的 JPEG 的 ALAssets 与原始对应物的哈希值不同。

对此进行深入研究,似乎操作系统修改了 ALAsset EXIF 数据中的“亮度值”、“组件配置”、“缩略图长度”和“缩略图图像”属性。此外,原始 JFIF 数据(对于带有 JFIF 的图像)已被剥离。

预期成绩:

  • 保存到照片库中时,所有三个文件都应具有相同的哈希值。