在应用程序中创建的电子邮件 jpg,包括元数据
Posted
技术标签:
【中文标题】在应用程序中创建的电子邮件 jpg,包括元数据【英文标题】:Email jpg created in app including metadata 【发布时间】:2011-09-15 14:21:55 【问题描述】:我已成功将元数据添加到在应用程序中创建的 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 附件中?有什么想法吗?
【问题讨论】:
您确定图像仍然包含您创建 UIImageJPEGRepresentation 之后的元数据吗?编辑:UIImageJPEGRepresentation seems to purge meta data 是的,UIImageJPEGRepresentation 会清除元数据。这就是我要解决的问题。我已经从应用程序中创建了一个图像,现在想用 GPS 元数据通过电子邮件发送它。当我 writeImageToSavedPhotosAlbum: 时,我可以成功添加字典,但是我想直接从应用程序通过电子邮件发送新图像。 【参考方案1】:UIImage 不包含任何元数据。如果您有图像的路径直接从中读取数据。如果您从相机胶卷中取回图像,则 UIImagePickerDelegate 中的 imagePickerController:didFinishPickingMediaWithInfo:
方法还包含信息字典中的元数据。
mimeType 也应该是“image/jpeg”。
编辑:
要将元数据添加到UIImage
,您可以使用ImageIO framework:您可以从 UIImage 创建CGImageDestination
对象,使用CGImageDestinationSetProperties
向其中添加元数据,然后获取原始数据(包括压缩图像和元数据)来自它
【讨论】:
感谢您的回复。有没有一种方法可以将元数据添加到图像并通过电子邮件发送,而无需用户从 imagePickerController 中检索图像?即从应用程序内创建图像并使用 GPS 元数据通过电子邮件发送?谢谢。 你应该看看ImageIO framework。您可以使用CGImageDestinationSetProperties
将元数据添加到CGImageDestination
,然后从中获取原始数据
我勾选了你的答案。虽然答案确实在您的最后评论中。【参考方案2】:
这是一个将元数据附加到 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
【讨论】:
以上是关于在应用程序中创建的电子邮件 jpg,包括元数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 JPA 和 mysql 启动在 Spring Boot 中创建的应用程序时出错
引用在 AppDelegate 中创建的 NSPersistentStore 实例