5

我在由PHContentEditingOutput. 当我像这样加载数据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) {
     ...
}];

错误:

Error Domain=NSCocoaErrorDomain Code=-1 “操作无法完成。(Cocoa 错误 -1。)”

更新:

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

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

该方法适用于视频 ( creationRequestForAssetFromVideoAtFileURL:),但不适用于图像。什么地方出了错?

4

2 回答 2

7

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

渲染内容URL

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

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

NSData *UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality);
于 2015-02-06T09:15:09.797 回答
2

在传递元数据时,每当方向(图像元数据内部)不是CGImagePropertyOrientationUp.

这也在文档中renderedContentURL说明:

编辑的资产内容必须包含(或“融入”)资产的预期方向。也就是说,您在输出图像或视频文件中写入的方向元数据(如果有)必须声明“向上”方向,并且在没有方向元数据的情况下,图像或视频数据必须正面朝上。

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

于 2018-12-21T20:13:59.173 回答