Горизонтальная ориентация «Ориентация = 6», которая была отредактирована метаданными для рулона камеры, не может быть сохранена - PullRequest
0 голосов
/ 09 апреля 2019

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

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

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

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

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

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

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

Шаги для воспроизведения:

  1. Сохраните снимок рулона камеры в разделе «Документы /。.

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

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

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

  5. Получите CGImageDestinationRef, указав contentEditingOutput.renderedContentURL с помощью CGImageDestinationCreateWithURL ().

    Сохранение CGImageDestinationRef с использованием CGImageDestinationFinalize.

  6. Создание PHAadjustmentData.Установите метаданные 'data'.

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

  8. Установите набор в changeRequestForAsset в PHPhotoLibrary.→ 'PHAssetChangeRequest * request = [PHAssetChangeRequest changeRequestForAsset: asset];'

  9. 'request.contentEditingOutput = contentEditingOutput;'

  10. 'завершение' равноошибка.следующая ошибка: 'Ошибка домена = 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); 
                                              } 
   
                                       }]; 

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

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

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

Сбой сохранения при перезаписи.

1 Ответ

0 голосов
/ 17 июня 2019

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

Пожалуйста, обратитесь к https://developer.apple.com/documentation/photokit/phcontenteditingoutput/1518655-renderedcontenturl Важно. Отредактированный контент актива должен включать (или «вводить») предполагаемую ориентацию актива. То есть метаданные ориентации (если таковые имеются), которые вы записываете в выходное изображение или видеофайл, должны объявлять ориентацию «вверх», а данные изображения или видео должны отображаться справа вверх при представлении без метаданных ориентации. Если вы хотите перезаписать метаданные ориентации в EXIF ​​или иным образом, попробуйте создать новый ресурс, а не использовать PHContentEditingOutput.

...