在应用程序中创建的电子邮件 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 实例

在 Snappy shell 中创建的表不会显示在 JDBC 或 Pulse 中

录制在 iPhone 应用程序中创建的声音

通过 java 应用程序连接在 mongolab 中创建的 mongodb