Ошибка PHPhotoLibrary при сохранении изображения по URL-адресу

Я создаю изображение по URL-адресу, предоставленному 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:), но не для изображения. Что пошло не так?


person Tomasz Bąk    schedule 05.02.2015    source источник
comment
Подождите - вы уже решили это, используя первый код, так в чем проблема?   -  person matt    schedule 05.02.2015
comment
Вы ведь знаете, что renderedContentURL — это то, во что вы должны писать, а не то, откуда вы должны читать, верно?   -  person matt    schedule 05.02.2015
comment
Да, это решает проблему, но лишь частично. Пожалуйста, посмотрите на обновление. Я задаю вопрос, чтобы добраться до сути этого.   -  person Tomasz Bąk    schedule 05.02.2015


Ответы (2)


Проблема в формате файла. Я пытался отредактировать скриншот PNG, но renderingContentURL всегда был tmp/имя_файла.JPG. Сначала я подумал, что это ошибка, но согласно документация это правильное поведение.

RenderedContentURL

Прочтите это свойство, чтобы найти URL-адрес для записи отредактированного содержимого актива. Затем, если вы редактируете фотообъект, запишите измененное фотоизображение в файл в формате JPEG по этому URL-адресу. При редактировании видеоресурса экспортируйте видео в файл QuickTime (.mov) по этому URL-адресу.

Решение состоит в том, чтобы преобразовать изображение с помощью функции

NSData *UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality);
person Tomasz Bąk    schedule 06.02.2015
comment
Что очень раздражает, так это то, что PNG является лучшим типом изображения, И внутри они не хранят изображение ни в JPEG, ни в PNG. Apple повсеместно продвигает HEIC с 2017 года, и кажется грустным, что из всех форматов изображений JPEG является худшим. - person Waxhaw; 10.05.2020

При передаче метаданных у меня также постоянно возникала проблема, когда Ориентация (внутри метаданных изображения) отличалась от CGImagePropertyOrientationUp.

Это также указано в документации renderedContentURL:

Отредактированное содержимое актива должно включать (или «запекать») предполагаемую ориентацию актива. То есть метаданные ориентации (если есть), которые вы записываете в выходное изображение или видеофайл, должны указывать ориентацию «вверх», а данные изображения или видео должны отображаться правой стороной вверх при представлении без метаданных ориентации.

Для изображений необходимо обновить следующие ключи метаданных (при этом данные изображения также ротируются):
kCGImagePropertyTIFFDictionary \ kCGImagePropertyTIFFOrientation
kCGImagePropertyOrientation
• возможно, kCGImagePropertyIPTCImageOrientation

person alex-i    schedule 21.12.2018