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

时间:2013-02-25 23:13:36

标签: ios exif

原始问题

我正在尝试将图像保存到相机胶卷中,同时保留所有原始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];
}];

我尝试使用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];

但这样做会导致相同的文件,逐字节,就像传递nil元数据字典一样,这意味着iOS仍然会剥离JFIF数据。

根据Wikipedia

  

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

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


更新:2013年2月26日

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

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

结果:

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

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

预期结果:

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

0 个答案:

没有答案