问题
I have successfully added metadata to a jpg created within the app and saved it to the Camera Roll using the
writeImageToSavedPhotosAlbum: metadata: completionBlock:
method. However I would also like the option of emailing this jpg with the metadata (such as location, exit, etc.). I use this to email:
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
NSData *myData = UIImageJPEGRepresentation(emailImage, 0.8);
[picker addAttachmentData:myData mimeType:@"image/jpg" fileName:@"photo"];
However, this results in no metadata.
When the saved image is sent via Apple's photo app, metadata is included.
Is there a way to embed the metadata into NSData attachment? Any ideas?
回答1:
UIImage doesn't hold any metadata. If you have the path for the image read data directly from it. If you get the image back from camera roll there's the imagePickerController:didFinishPickingMediaWithInfo:
method from UIImagePickerDelegate which also contains the metadata inside the info dictionary.
Also the mimeType should be "image/jpeg".
Edit:
To add metadata to a UIImage
you can use the ImageIO framework: You can create a CGImageDestination
object from a UIImage, add metadata to it using CGImageDestinationSetProperties
and then get the raw data (which includes the compressed image and the metadata) from it
回答2:
Here is an example code to attach metadata to a NSMutableData object, which can be mailed.
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
来源:https://stackoverflow.com/questions/7432411/email-jpg-created-in-app-including-metadata