如何在不复制图像的情况下将exif元数据注入图像?

时间:2012-03-21 22:31:19

标签: ios ios5 core-graphics exif cgimagesource

我之前曾问过这个问题:How to write exif metadata to an image

我现在已经找到了一种注入元数据的方法。但是,它会将图像副本复制到内存中。对于大图像,并且需要在内存中已经有副本,这将具有性能,并可能导致内存崩溃。

是否有正确的方法来注入元数据而无需复制图像?也许它可以在写入磁盘后添加到文件中?

我更喜欢本机实现,如果可能的话,不必为此而诉诸第三方库。

3 个答案:

答案 0 :(得分:1)

根据您的需要,此问题可能需要少量或大量代码。 EXIF数据存储在JPEG APP1标记(FFE1)中。它看起来非常像带有TIFF标题,IFD和带有数据的单个标签的TIFF文件。如果您可以构建自己的APP1标记段,那么插入它或将其替换为JPEG文件是微不足道的。如果您希望从现有文件中读取元数据,请添加一些新标记,然后将其写回,这可能会更复杂。 EXIF数据的棘手部分是那些需要超过4个字节的标签。每个TIFF标记为12个字节:2字节标记,2字节数据类型,4字节计数,4字节数据。如果数据不完全适合标记的4个字节,则标记指定文件中的绝对偏移量,以查找数据的位置。如果现有数据包含任何带有此类数据的标签(例如品牌,型号,捕获日期,捕获时间等),则需要通过修复偏移重新打包该数据,然后添加自己的数据。简而言之:

1)如果要将预先制作的APP1标记添加到JPEG文件中,这很简单,只需要很少的代码。

2)如果你需要从JPEG文件中读取现有的元数据,添加自己的元数据并将其写回,代码更复杂一些。这并不“困难”,但它涉及的不仅仅是读取和写入数据块。

首先阅读TIFF 6.0规范,了解标签和目录结构:

TIFF 6.0 spec

接下来,看一下JPEG EXIF规范:

EXIF 2.2 Spec

答案 1 :(得分:0)

我希望现有的exif操纵器软件可以做到,但还没有测试过。

链接:

答案 2 :(得分:0)

CGImageSourceRef可用于获取图像属性,包括其缩略图,而无需将所有图像数据加载到内存中。这样,UIImage和NSData就不会浪费内存。

CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path], NULL);

然后保存CGImageDestinationRef添加源图像和exif数据。

CGImageDestinationAddImageFromSource (destRef,    
                                      imageSource,
                                      0,
                                     (CFDictionaryRef)propertes );//exif
BOOL success = CGImageDestinationFinalize(destRef);