如何使用来自 PHImageManager 的图像数据

How to use image data from PHImageManager

我需要尽可能高效地处理和存储来自 PHImageManager 的图像数据。

为此,我需要获取 iOS 相册中的每张图片,这样我就可以通过 CIImage 对象读取它,这样我就可以为 CBIR 应用过滤器和提取描述符数据库在一个单独的线程上。

使用 [PHAsset requestContentEditingInput] 打开图像文件 URL 不是一个选项。它在技术上可以打开图像文件并读取它,但我运气不好,因为它强制回调进入主队列并且似乎依赖于将调用保留在主队列中。它会在后台队列中处理多个图像后使应用程序崩溃,我相当确定 API 仅用于主队列中发生的编辑会话。

PHImageManager 提供了一个可以在后台线程上同步调用的 API requestImageDataForAsset。这似乎更适合需要处理图像而不充当交互式编辑工具的图像处理应用程序,这是我的确切用例。我还需要元数据,特别是图像的方向,这 API return 也是如此。

麻烦的是我找不到实际讨论这个问题的信息片断API。它说它将 return 一个 NSData,但这并没有告诉我它将是位图 RBG 数据、JPEG 数据和其他有用的信息。

我想用这些数据创建一个 CIImage,但是 API 没有给我像素格式、颜色 space 或任何其他信息。我大概可以假设 RGB 和每个像素 3 个字节。但这可能是错误的。

有没有人用过这个 API 并且可以解释它的行为? Apple 的 2014 WWDC 视频甚至没有真正讨论它。

经过一些修改和试验,返回的 NSData 对象可用于使用 +[CIImage imageWithData:] 创建 CIImage 对象。

根据该方法的文档,数据必须是图像流格式,如 JPEG 或 TIFF,因此流是其中之一是有意义的。

此外,iOS 9 中似乎确实存在一个错误,如果 URL 中的图像已损坏或无法用于创建图片。

检查+[CIImage imageWithData:] returns是否为nil可以避免崩溃,提示URL处的图片数据不能用于生成CIImage。