Я пытаюсь редактировать метаданные фотографии с камеры.
Однако, если вы пытаетесь перезаписать фотографию после редактирования метаданных, всегда выдает следующую ошибку:
'Ошибка домена = NSCocoaErrorDomain Code = -1 "Операция не может быть завершена. (Ошибка какао -1.)'
Это происходит с фотографиями, такими как пейзажизображения (с тегом ориентации «6»).
Для портретных изображений (тег ориентации - «1») можно правильно перезаписывать и сохранять фотографии.
Если вы декодируете с помощью UIImageJPEGRepresentation (image, 1.0) , изображения ландшафта могут быть перезаписаны и сохранены.
Но я не хочу снижать качество изображения, поэтому я ищу другойway.
Шаги для воспроизведения:
Сохраните снимок рулона камеры в разделе «Документы /。.
Редактирование метаданных одной фотографии. (Отныне в разделе Документы /)
Получить актив «requestContentEditingInputWithOptions ()».
Получить URL-адрес фотографии «Step2» и получить CGImageSourceRef с помощью «CGImageSourceCreateWithURL ()»
Получите CGImageDestinationRef, указав contentEditingOutput.renderedContentURL с помощью CGImageDestinationCreateWithURL ().
Сохранение CGImageDestinationRef с использованием CGImageDestinationFinalize.
Создание PHAadjustmentData.Установите метаданные 'data'.
Установите AdjustmentData в setAdjustmentData
Установите набор в changeRequestForAsset в PHPhotoLibrary.→ 'PHAssetChangeRequest * request = [PHAssetChangeRequest changeRequestForAsset: asset];'
'request.contentEditingOutput = contentEditingOutput;'
'завершение' равноошибка.следующая ошибка: 'Ошибка домена = 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);
}
}];
Ожидаемые результаты:
Возможность перезаписи и сохранения изображения ландшафта с отредактированными метаданными на рулоне камеры.
Фактические результаты:
Сбой сохранения при перезаписи.