PHPhotoLibrary在保存URL图片时出现错误

6

我在由PHContentEditingOutput提供的URL创建了一个图像。当我将数据加载到UIImage并按照以下方式保存时,它可以正常工作。

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    NSData *data = [NSData dataWithContentsOfURL:contentEditingOutput.renderedContentURL]
    UIImage *image = [UIImage imageWithData:data];
    [PHAssetChangeRequest creationRequestForAssetFromImage:image];
} completionHandler:^(BOOL success, NSError *error) {
     ...
}];

但是当我尝试通过url访问时失败:

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    [PHAssetChangeRequest creationRequestForAssetFromImageAtFileURL:contentEditingOutput.renderedContentURL];
} completionHandler:^(BOOL success, NSError *error) {
     ...
}];

错误:

错误域=NSCocoaErrorDomain Code=-1 "无法完成操作。 (Cocoa 错误-1。)"

更新:

当我尝试保存修改时出现相同的错误。

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    PHAssetChangeRequest *request = [PHAssetChangeRequest changeRequestForAsset:asset];
    request.contentEditingOutput = contentEditingOutput;
} completionHandler:^(BOOL success, NSError *error) {
     ...
}];

这种方法适用于视频(creationRequestForAssetFromVideoAtFileURL:),但不适用于图片。出了什么问题?


等等 - 你已经通过使用第一段代码解决了它,那问题是什么? - matt
你知道 renderedContentURL 是你应该写入的内容,而不是你应该从中读取的内容吗? - matt
是的,它解决了问题,但只是部分地。请看更新。我提出这个问题是为了找到根本原因。 - Tomasz Bąk
2个回答

7
问题出在文件格式上。我试图编辑PNG截图,但renderingContentURL总是tmp/filename.JPG。起初我以为这是一个错误,但根据文档,这是正确的行为。

renderedContentURL

读取此属性以查找用于编写已编辑资产内容的URL。然后,如果正在编辑照片资产,请将修改后的照片图像写入此URL处的JPEG格式文件。如果正在编辑视频资产,请将视频导出到此URL处的QuickTime (.mov)文件中。

解决方案是使用函数将图像转换为

NSData *UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality);

真的很烦人的是,PNG是更好的图像类型,但在内部它们既不使用JPEG也不使用PNG存储图像。自2017年以来,苹果一直在各个方面推广HEIC,而在所有图像格式中,JPEG似乎是最差的。 - Waxhaw

2
当传递元数据时,如果图像元数据中的方向不是CGImagePropertyOrientationUp,则会出现问题。
这也在renderedContentURL文档中指出:

编辑的资产内容必须包含(或“烘焙”)资产的预期方向。也就是说,输出的图像或视频文件中写入的方向元数据(如果有)必须声明“上”方向,当没有方向元数据时呈现的图像或视频数据必须正面朝上。

对于图像,需要更新以下元数据键(同时旋转图像数据):
kCGImagePropertyTIFFDictionary \ kCGImagePropertyTIFFOrientation
kCGImagePropertyOrientation
• 可能还有kCGImagePropertyIPTCImageOrientation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接