如何使用PHImageManager

时间:2015-10-27 20:03:52

标签: ios core-image photosframework

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

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

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

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

问题在于我无法找到实际讨论此API的一小部分信息。它说它会返回一个NSData,但这并没有告诉我它将是位图RBG数据,JPEG数据和其他有用的信息。

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

是否有人使用此API并可以解释其行为? Apple的2014年WWDC视频甚至没有真正讨论它。

1 个答案:

答案 0 :(得分:0)

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

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

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

通过检查..... (SELECT TOP (100) PERCENT ROW_NUMBER() OVER (ORDER BY R.Road DESC) AS RoadNumber...... 是否返回nil可以避免崩溃,这表明URL中的图像数据不能用于生成CIImage。