我正在尝试将图像保存到相机胶卷中,同时保留所有原始 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 数据吗?
我已经向<rdar://13291591>苹果提交了申请。我还创建了一个演示该问题的示例项目:http : //spolet.to/3J0l1u3w0R2e
示例应用程序具有三个按钮:一个用于带有 JFIF 数据的 JPEG,一个用于没有 JFIF 数据的 JPEG,一个用于 PNG。当点击按钮时,相应的图像将被散列并保存到照片库中。生成的 ALAsset 也将被散列。
结果:
对此进行深入研究,似乎操作系统修改了 ALAsset EXIF 数据中的“亮度值”、“组件配置”、“缩略图长度”和“缩略图图像”属性。此外,原始 JFIF 数据(对于带有 JFIF 的图像)已被剥离。
预期成绩:
| 归档时间: |
|
| 查看次数: |
2113 次 |
| 最近记录: |