В настоящее время я использую AVCaptureStillImageOutput
, чтобы получить изображение с полным разрешением. Я также могу получить метаданные exif, используя следующий код:
[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
{
CFDictionaryRef metaDict = CMCopyDictionaryOfAttachments(NULL, imageSampleBuffer, kCMAttachmentMode_ShouldPropagate);
CFMutableDictionaryRef mutableDict = CFDictionaryCreateMutableCopy(NULL, 0, metaDict);
NSLog(@"test attachments %@", mutableDict);
// set the dictionary back to the buffer
CMSetAttachments(imageSampleBuffer, mutableDict, kCMAttachmentMode_ShouldPropagate);
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];
[self.delegate frameReadyToSave:image withExifAttachments: mutableDict];
}];
Метаданные находятся в переменной mutableDict
. Теперь я хочу сохранить это изображение в двух разных местах с метаданными. Хочу сохранить на диске в папках приложений и в библиотеке фотографий.
Теперь я попытался сохранить изображение другим способом, используя следующее (переменная изображения, которую вы видите, является настраиваемым объектом):
NSData* imageData = UIImageJPEGRepresentation(image.image, 1.0f);
[imageData writeToFile:image.filePath atomically:YES];
UIImageWriteToSavedPhotosAlbum(image.image, nil, nil, nil);
Теперь изображение правильно сохранено, но не содержит метаданных Exif.
Из того, что я прочитал, для этого мне нужно использовать PHPhotoLibrary, но документация по этому поводу не слишком обширна. Вот что я нашел:
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image.image];
} completionHandler:nil];
Но как мне сохранить с ним метаданные?