我正在尝试编辑相机滚动照片的元数据。
但是,如果您试图在编辑元数据后覆盖照片,总是会给出以下错误:
'Error Domain=NSCocoaErrorDomain Code=-1“操作无法完成。(可可错误-1.)'
这发生在照片,如景观图像(方向标签'6')。
对于肖像图像(方向标签为'1'),可以正确地覆盖和保存照片。
如果您使用UIImageJPEGRepresentation (Image1.0)进行解码,则可以覆盖和保存景观图像。
但我不想降低图像的质量,所以我正在寻找另一种方式。
复制步骤:
遵循代码的:
- (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);
}
}]; 预期结果:
能够覆盖和保存带有编辑后的元数据的风景图像。
实际结果:
覆盖保存失败。
发布于 2019-06-17 01:41:46
我从苹果的反馈助理那里得到了答案。下面是一段引语。
请参考https://developer.apple.com/documentation/photokit/phcontenteditingoutput/1518655-renderedcontenturl重要的编辑资产内容,必须包含(或“烘焙”)资产的预定方向。也就是说,您在输出图像或视频文件中写入的定向元数据(如果有的话)必须声明“向上”方向,而在没有方位元数据的情况下,图像或视频数据必须向上显示。如果要在EXIF或其他文件中重写定向元数据,则应尝试创建新资产,而不是使用PHContentEditingOutput。
https://stackoverflow.com/questions/55583659
复制相似问题