经过元数据编辑到相机胶卷的水平方向“方向= 6”无法保存

时间:2019-04-09 00:53:50

标签: objective-c metadata photo photosframework phphotolibrary

我正在尝试编辑相机胶卷照片的元数据。

但是,如果您在编辑元数据后尝试覆盖照片,则始终会出现以下错误:

'错误域= NSCocoaErrorDomain代码= -1“操作无法完成。(可可错误-1。)'

这种情况在诸如风景图像(方向标记为“ 6”)的照片中发生。

对于人像图像(方向标记为'1'),可以正确覆盖和保存照片。

如果使用 UIImageJPEGRepresentation(图像,1.0) 进行解码,则可以覆盖和保存风景图像。

但是我不想降低图像质量,所以我正在寻找另一种方法。

复制步骤:

  1. 将相机胶卷的图片保存在“文档/”下。

  2. 编辑一张照片的元数据。 (从现在开始,在“文档”下)

  3. 获取资产“ requestContentEditingInputWithOptions()”。

  4. 获取“ Step2”照片的URL,并使用“ CGImageSourceCreateWithURL()”获取CGImageSourceRef

  5. 通过指定contentEditingOutput.renderedContentURL来获取CGImageDestinationRef 'CGImageDestinationCreateWithURL()'。

  6. 将CGImageSourceRef,CGImageDestinationRef和元数据设置为CGImageDestinationAddImageFromSource。

  7. 使用CGImageDestinationFinalize保存CGImageDestinationRef。

  8. 创建PHAadjustmentData。将元数据设置为“数据”。

  9. 在setAdjustmentData中设置AdjustmentData

  10. 在PHPhotoLibrary的changeRequestForAsset中设置设置。 →'PHAssetChangeRequest *请求= [PHAssetChangeRequest changeRequestForAsset:资产];'

  11. 'request.contentEditingOutput = contentEditingOutput;'

  12. “完成”是错误。出现以下错误:Error'Error Domain = NSCocoaErrorDomain Code = -1“该操作无法 完成。 (可可错误-1。)'

以下代码:

    - (void)replaceMetadataIntoPhoto:(NSInteger)index metadata:(NSDictionary *)metadata 
    { 
        PHAsset *asset = _assetsList[index]; 
   
        [asset requestContentEditingInputWithOptions:nil 
                                   completionHandler:^(PHContentEditingInput *_Nullable contentEditingInput, NSDictionary *_Nonnull info) { 
   
                                       NSURL *url = [contentEditingInput fullSizeImageURL]; 
                                       CGImageSourceRef sourceImage = CGImageSourceCreateWithURL((__bridge CFURLRef)url, nil); 
   
                                       PHContentEditingOutput *contentEditingOutput = [[PHContentEditingOutput alloc] initWithContentEditingInput:contentEditingInput]; 
   
                                       CGImageDestinationRef outputDestination = CGImageDestinationCreateWithURL((__bridge CFURLRef)contentEditingOutput.renderedContentURL, CGImageSourceGetType(sourceImage), 1, NULL); 
   
                                       CGImageDestinationAddImageFromSource(outputDestination, sourceImage, 0, (__bridge CFDictionaryRef)metadata); 
   
                                       CGImageDestinationFinalize(outputDestination); 
                                       CFRelease(sourceImage); 
                                       CFRelease(outputDestination); 
   
                                       PHAdjustmentData *adjustmentData = 
                                       [[PHAdjustmentData alloc] initWithFormatIdentifier:@"hogehoge" 
                                                                            formatVersion:@"1.0" 
                                                                                     data:[NSKeyedArchiver archivedDataWithRootObject:@{@"metadata": metadata}]]; 
   
                                       [contentEditingOutput setAdjustmentData:adjustmentData]; 
   
                                       [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
                                           PHAssetChangeRequest *request = [PHAssetChangeRequest changeRequestForAsset:asset]; 
                                           request.contentEditingOutput = contentEditingOutput; 
   
                                       }   completionHandler:^(BOOL success, NSError *error) { 
                                             if (error) { 
                                                  DBGLog(@"error=%@", error); 
                                              } 
   
                                       }]; 

预期结果:

具有将经过编辑的元数据覆盖并保存在相机胶卷上的风景图像的功能。

实际结果:

无法覆盖保存。

1 个答案:

答案 0 :(得分:0)

我从Apple的反馈助手那里得到了答案。 以下是报价。

  

请参阅https://developer.apple.com/documentation/photokit/phcontenteditingoutput/1518655-renderedcontenturl重要信息编辑后的资产内容必须纳入(或“纳入”)资产的预期方向。也就是说,您在输出图像或视频文件中写入的方向元数据(如果有的话)必须声明“向上”方向,并且在不显示方向元数据的情况下显示时,图像或视频数据必须显示为右侧。如果要用EXIF或其他方式重写方向元数据,则应尝试创建新资产,而不要使用PHContentEditingOutput。