0

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

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

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

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

问题是我找不到真正讨论这个 API 的信息。它说它将返回一个 NSData,但这并没有告诉我它将是位图 RBG 数据、JPEG 数据和其他有用的信息。

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

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

4

1 回答 1

0

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

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

此外,iOS 9 中似乎确实存在一个错误,+[CIImage imageWithContentsOfURL:]如果 URL 上的图像损坏或无法用于创建图像,则会导致崩溃。

通过检查是否返回 nil 可以避免崩溃+[CIImage imageWithData:],表明 URL 处的图像数据不能用于生成 CIImage。

于 2015-10-28T03:39:52.303 回答