Электронная почта в формате jpg, созданная в приложении, включая метаданные

Я успешно добавил метаданные в файл jpg, созданный в приложении, и сохранил его в фотопленке с помощью

writeImageToSavedPhotosAlbum: metadata: completionBlock: 

метод. Однако я также хотел бы отправить этот jpg по электронной почте с метаданными (такими как местоположение, выход и т. Д.). Я использую это для электронной почты:

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
NSData *myData =  UIImageJPEGRepresentation(emailImage, 0.8);
[picker addAttachmentData:myData mimeType:@"image/jpg" fileName:@"photo"];

Однако это приводит к отсутствию метаданных.
Когда сохраненное изображение отправляется через фотоприложение Apple, метаданные включаются. Есть ли способ встроить метаданные в вложение NSData? Любые идеи?


person Ted    schedule 15.09.2011    source источник
comment
Вы уверены, что изображение по-прежнему содержит метаданные после создания UIImageJPEGRepresentation? Изменить: UIImageJPEGRepresentation, похоже, очищается метаданные   -  person ff10    schedule 15.09.2011
comment
Да, UIImageJPEGRepresentation очищает метаданные. Это проблема, которую я пытаюсь решить. Я создал изображение из приложения и теперь хочу отправить его по электронной почте с метаданными GPS. Я могу успешно добавить обратно словари, когда я пишуImageToSavedPhotosAlbum:, однако я хочу отправить новое изображение по электронной почте непосредственно из приложения.   -  person Ted    schedule 16.09.2011


Ответы (2)


UIImage не содержит метаданных. Если у вас есть путь к изображению, считывайте данные непосредственно из него. Если вы вернете изображение из камеры, есть метод imagePickerController:didFinishPickingMediaWithInfo: из UIImagePickerDelegate, который также содержит метаданные внутри информационного словаря.

Также mimeType должен быть "image/jpeg".

Изменить. Чтобы добавить метаданные в UIImage, вы можете использовать Среда ImageIO: вы можете создать объект CGImageDestination из UIImage, добавить к нему метаданные с помощью CGImageDestinationSetProperties, а затем получить из него необработанные данные (включая сжатое изображение и метаданные)

person alex-i    schedule 15.09.2011
comment
Спасибо за ответ. Есть ли способ добавить метаданные к изображению и отправить его по электронной почте без того, чтобы пользователь извлекал изображение из imagePickerController? то есть создать изображение из приложения и отправить его по электронной почте с метаданными GPS? Спасибо. - person Ted; 16.09.2011
comment
Вам следует взглянуть на инфраструктуру ImageIO для этого. Вы можете добавить метаданные в CGImageDestination с помощью CGImageDestinationSetProperties, а затем получить из него необработанные данные. - person alex-i; 16.09.2011
comment
Я отметил твой ответ. Хотя ответ действительно был в вашем последнем комментарии. - person Ted; 16.09.2011

Вот пример кода для прикрепления метаданных к объекту NSMutableData, который можно отправить по почте.

UIImage* yourImage = ... from somewhere ...
NSDictionary* info = ... in my case from didFinishPickingMediaWithInfo:

CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef) UIImageJPEGRepresentation(yourImage, 0.5 /* compression factor */), NULL);

NSMutableData* imageData = [NSMutableData data];

CGImageDestinationRef imageDest = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, kUTTypeJPEG, 1, NULL);
CGImageDestinationAddImageFromSource(imageDest, source, 0, (__bridge CFDictionaryRef)info[@"UIImagePickerControllerMediaMetadata"]);
CGImageDestinationFinalize(imageDest);

CFRelease(imageDest);
CFRelease(source);

// at this point, imageData will contain your image + metadata
person David    schedule 21.07.2016