0

要从 CGImage 检索像素值,我使用 CGContextDrawImage (如下所述: 如何从 UIImage (Cocoa Touch) 或 CGImage (Core Graphics) 获取像素数据?)。唯一的区别是我创建了 128 bpp 浮动组件上下文,而不是通常的 32 bpp 上下文。从使用选项 kCGImageSourceShouldAllowFloat 创建的 CGImageSource 获得的源 CGImage。通过这种方式,我希望能够访问与我的位图上下文颜色空间匹配的浮点像素值,并将它们用于进一步的图像处理。问题是生成的图像数据似乎正在失去动态范围。它可以在阴影、纯蓝天区域看到。它们变得轮廓分明,缺乏细节。一些调查表明问题发生在 CGContextDrawImage (源 CGImage 包含完整的动态范围,通过 CGImageDestination 保存它证明了这一点)和 CGContextDrawImage 上下文内容变得分色后。

经过更多调查后,我发现了这一点:http: //lists.apple.com/archives/quartz-dev/2007/mar/msg00026.html 这使我得出结论,问题不在我的代码中,而在核心图形中,或者那是预期的行为。

我的问题是:使用核心图形从图像中获取浮点数据的正确方法是什么?

4

1 回答 1

0

经过一些进一步的调查,问题被缩小到以下问题:当 8 位图像被绘制到使用线性颜色空间 (kCGColorSpaceGenericRGBLinear) 创建的 128 bpp 浮点上下文时,会发生分色。如果我将相同的图像绘制到使用 kCGColorSpaceGenericRGB 创建的上下文中,然后从该上下文中检索 CGImage 并将第二个图像绘制到线性颜色空间上下文中,一切正常。

其他解决方案(解决方法?)是使用核心图像:从源 CGImage 创建 CIImage 并将其绘制到使用相应的 kCGColorSpaceGenericRGBLinear CGContext 创建的 CIContext。但这是 OS X 上的唯一选项(不在 iOS 上)。

于 2011-05-04T18:32:41.817 回答