我在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) {
...
}];
错误:
错误域= NSCocoaErrorDomain代码= -1"无法完成操作。 (可可错误-1。)"
更新
尝试保存修改时出现同样的错误。
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *request = [PHAssetChangeRequest changeRequestForAsset:asset];
request.contentEditingOutput = contentEditingOutput;
} completionHandler:^(BOOL success, NSError *error) {
...
}];
该方法适用于视频(creationRequestForAssetFromVideoAtFileURL:
),但不适用于图像。出了什么问题?
答案 0 :(得分:5)
问题在于文件格式。我正在尝试修改 PNG 屏幕截图,但renderingContentURL
始终是 tmp / filename。 JPG 。起初我认为这是一个错误,但根据the documentation这是正确的行为。
阅读此属性以查找用于编写已编辑资产内容的URL。然后,如果编辑照片资产,请将更改后的照片图像写入此URL的JPEG格式文件。如果要编辑视频资源,请将视频导出到此URL的QuickTime(.mov)文件。
解决方案是使用函数
转换图像NSData *UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality);
答案 1 :(得分:0)
在传递元数据时,只要 Orientation (在图像元数据内部)不是CGImagePropertyOrientationUp
之外,我都会遇到问题。
renderedContentURL
文档中也对此进行了说明:
编辑后的资产内容必须包含(或“纳入”)预期的 资产的方向。也就是说,方向元数据(如果有) 您在输出图像或视频文件中写入的内容必须声明“ up” 方向,并且图像或视频数据必须显示为正面朝上 在没有方向元数据的情况下显示。
对于图像,需要更新以下元数据键(同时旋转图像数据):
•kCGImagePropertyTIFFDictionary
\ kCGImagePropertyTIFFOrientation
•kCGImagePropertyOrientation
•可能是kCGImagePropertyIPTCImageOrientation