【问题标题】:How to inject exif metadata into an image, without copying the image?如何在不复制图像的情况下将 exif 元数据注入图像?
【发布时间】:2012-04-06 12:22:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您将元数据添加到文件中,则文件的大小会增大。为了管理它,您可以将其读入内存,添加数据并将其写回(操作系统显然是这样做的)或编写您自己的代码,一次读取/写入较小的文件块。
  • 是的,我不想将它完全读入内存,但我知道的所有 Apple API 都需要这样做。我指的是读/写一点,虽然我不知道正确的格式并且不希望损坏文件。

标签: ios ios5 core-graphics exif cgimagesource


【解决方案1】:

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

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

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

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

TIFF 6.0 spec

接下来,看看 JPEG EXIF 规范:

EXIF 2.2 Spec

【讨论】:

  • 我会将 exif 数据作为 NSDictionary,因此阅读不是问题。您知道任何可以执行创建标记细节的库吗?我可以理解规范,但我当然不想重新发明轮子。
【解决方案2】:

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

链接:

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 我一直在浏览这方面的文档。我可以理解如何检索数据,但不理解如何将其注入到磁盘上的原始图像中。如果我只创建一个缩略图的 CGImageSourceRef,那么在调用 CGImageDestinationAddImageFromSource 时我会用它覆盖原始图像吗?
    • 查看 Apple 的 SquareCam 示例。 writeCGImageToCameraRoll 方法具有创建目的地,添加源数据,然后将其保存到磁盘/相册。
    • @AlexL 如何检索元数据中的缩略图?没有用于访问缩略图的“键”!
    • @neeraj 查看 Apple 的参考“从图像源创建缩略图”示例 developer.apple.com/library/ios/documentation/GraphicsImaging/…
    • @neeraj 我不知道你的问题的答案,但我假设当 kCGImageSourceCreateThumbnailFromImageIfAbsent 为真并且缩略图已经存在时,它将被重用。否则,该选项的目的是什么。
    猜你喜欢
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2015-02-28
    相关资源
    最近更新 更多