【问题标题】:iPhone ImageIO not returning all metadata of pictureiPhone ImageIO 不返回图片的所有元数据
【发布时间】:2012-12-16 14:13:20
【问题描述】:

我目前正在尝试制作一个简单的库,用于以面向对象的方式访问图片元数据(不再需要字典)。我遇到了很多奇怪的错误:

  1. 即使定义了kCGImagePropertyMakerMinoltaDictionarykCGImagePropertyMakerFujiDictionarykCGImagePropertyMakerOlympusDictionarykCGImagePropertyMakerPentaxDictionary 键,我在编译我的项目时仍会收到错误提示它们未定义:

    架构 armv7 的未定义符号: “_kCGImagePropertyMakerMinoltaDictionary”,引用自: - SYMetadata.o 中的[SYMetadata metadataMakerMinolta] ld: 未找到架构 armv7 的符号

  2. kCGImagePropertyExifBodySerialNumber 也是来自ImageIO/CGImageProperties.h 的已定义键,但在 iOS 5.1.1 中加载项目时,我收到一条错误消息,提示它不可用:

    dyld:未找到符号:_kCGImagePropertyExifBodySerialNumber 引用自:/var/mobile/Applications/0D8144E6-6313-4347-B503-247F5ACC0A11/ConnectTIG.app/ConnectTIG 预期在:/System/Library/Frameworks/ImageIO.framework/ImageIO 在 /var/mobile/Applications/0D8144E6-6313-4347-B503-247F5ACC0A11/ConnectTIG.app/ConnectTIG

  3. Apple 有很多可能的元数据字典键可用,例如 kCGImagePropertyMakerNikonDictionary,它们存在但不起作用。例如,我有一张使用 Nikon D3100 拍摄的照片:当我在 Mac 上使用 Preview 应用程序打开它时,我可以访问 Nikon 元数据,但是当我在 iPhone 上获取所有键和值时,我没有这些信息。

我在 Moutain Lion 10.8.2 上运行 XCode 4.5.2(最后一个稳定版本 AFAIK)。我尝试在设备和模拟器上编译/运行,结果相同。

由于这将是一个公共图书馆,我已经在我的 github 存储库中找到了所有内容:https://github.com/dvkch/SYPictureMetadata

欢迎那些愿意发现这些错误从何而来的人来玩代码并随时提交推送请求。

如果您有任何可能的想法,将不胜感激!

斯坦

【问题讨论】:

  • 所以,我对你写的问题有点困惑。您是否正在将使用尼康 D3100 拍摄的文件移动到 iPhone 上?我的意思是,这把钥匙没有理由出现在用 iPhone 拍摄的照片中——它不是尼康。 ??
  • 对不起,我尝试通过邮件传输,并且使用了EyeFi卡。除非我使用 NEF 格式,否则这些都不起作用。
  • 我还通过在我的应用程序中将文件作为资源导入来做到这一点。请查阅我的存储库并构建示例应用程序,您将很快能够重现这些错误。
  • 我想弄清楚当图像到达手机时是否还有您正在谈论的元数据。想知道这是否在复制过程中被剥离。这就是我问的原因。有趣的转移到手机上,然后再传回电脑,看看它在电脑上是否仍然有效。
  • 我做到了。我将图像作为应用程序的资源包含在内,然后使用 iFunBox 将它们取回,打开它们并看到所有元数据仍然存在。显然我不是唯一一个有问题的人:stackoverflow.com/questions/12224530/…

标签: objective-c metadata exif javax.imageio


【解决方案1】:

我很确定 SDK 有问题。您收到的错误是 SDK 中定义的符号,但实际上并不存在。我检查了你的项目,你已经包含了 ImageIO.framework ,它们都被定义了,实际上所有其他键都可以正常工作。 kCGImagePropertyMakerNikonCameraSerialNumber 有效,但 kCGImagePropertyMakerMinoltaDictionary 无效。

如果您查看 CGImageProperties 文档的顶部,它会说框架是“ApplicationServices/ImageIO”。这是不可能的,iOS 上不存在 ApplicationServices。本文档中至少存在一个错误。显然他们已经逐字复制了 OSX 文档。

我肯定会就这个问题和文档提交错误报告。

FWIW 在 OSX 上这些键(在 iOS 上可能相同)如下:

{MakerCanon}
{MakerNikon}
{MakerMinolta}
{MakerFuji}
{MakerOlympus}
{MakerPentax}

【讨论】:

  • 谢谢,我就是这么想的。您对第 2 点有任何想法吗?那是同一个问题吗? 3 呢?
  • 哦,如果你有办法让代码在使用或不使用 kCGImagePropertyExifBodySerialNumber 的情况下编译,我希望我的方法在 iOS 5.0 下工作并始终返回 nil,并且它确实使用了高于 6.0 的版本的密钥。
  • 错误报告已填写,希望他们有答案。我已经填了一个关于 5.1 版本的 iOS 模拟器不工作的错误,但从未得到答案
  • 我认为第 2 点是同一件事,但我没有调查或确认。
  • 第 3 点听起来好像元数据从未打算在 iOS 上使用。当我在 iOS 上试用 CoreImage 时,我也遇到了类似的情况。有一种方法可以将 GL 纹理转换为 CIImage,但我发现它不起作用。当我报告时,该方法立即从 SDK 中删除。 (我认为 iOS 6 他们返回并实际构建了它)
猜你喜欢
  • 1970-01-01
  • 2017-08-28
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
相关资源
最近更新 更多