Горизонтальная ориентация «ориентация = 6», которая была отредактирована метаданными в фотопленке, не может быть сохранена

Я пытаюсь отредактировать метаданные фотографии камеры.

Однако, если вы попытаетесь перезаписать фотографию после редактирования метаданных, всегда выдает следующую ошибку:

'Error Domain=NSCocoaErrorDomain Code=-1 "Операция не может быть завершена. (Ошибка Cocoa -1.)"

Это происходит с фотографиями, такими как пейзажные изображения (с тегом ориентации «6»).

Для портретных изображений (тег ориентации «1») можно правильно перезаписывать и сохранять фотографии.

Если вы декодируете с помощью UIImageJPEGRepresentation (изображение, 1.0), пейзажные изображения могут быть перезаписаны и сохранены.

Но я не хочу снижать качество изображения, поэтому ищу другой способ.

Действия по воспроизведению:

  1. Сохраните изображение фотопленки в разделе «Документы / 。».

  2. Отредактируйте метаданные одной фотографии. (Отныне в разделе Документы/)

  3. Получите актив «requestContentEditingInputWithOptions()».

  4. Получите URL-адрес фотографии «Шаг 2» и получите CGImageSourceRef с помощью «CGImageSourceCreateWithURL ()».

  5. Получите CGImageDestinationRef, указав contentEditingOutput.renderedContentURL с 'CGImageDestinationCreateWithURL ()'.

  6. Задайте для CGImageSourceRef, CGImageDestinationRef и метаданных значение CGImageDestinationAddImageFromSource.

  7. Сохраните CGImageDestinationRef с помощью CGImageDestinationFinalize.

  8. Создайте PHAadjustmentData. Установите метаданные на «данные».

  9. Установите AdjustmentData в setAdjustmentData

  10. Установите набор в changeRequestForAsset библиотеки PHPhotoLibrary. → 'PHAssetChangeRequest * запрос = [PHAssetChangeRequest changeRequestForAsset: актив];'

  11. 'request.contentEditingOutput = contentEditingOutput;'

  12. "завершение" - ошибка. следующая ошибка:  'Error Domain=NSCocoaErrorDomain Code=-1 "Операция не может быть завершенный. (Ошибка какао -1.)'

следуя коду:

    - (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); 
                                              } 
   
                                       }]; 

Ожидаемые результаты:

Возможность перезаписать и сохранить ландшафтное изображение с отредактированными метаданными в фотопленке.

Фактические результаты:

Не удается перезаписать сохранение.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
163
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я получил ответ от Apple Feedback Assistant. Ниже приведена цитата.

Please refer to https://developer.apple.com/documentation/photokit/phcontenteditingoutput/1518655-renderedcontenturl Important Edited asset content must incorporate (or “bake in”) the intended orientation of the asset. That is, the orientation metadata (if any) that you write in the output image or video file must declare the “up” orientation, and the image or video data must appear right-side up when presented without orientation metadata. If you want to rewrite orientation metadata in the EXIF or otherwise, you should try creating a new asset, rather than using PHContentEditingOutput.

Другие вопросы по теме