要从CGImage中检索像素值,我使用CGContextDrawImage(如下所述: How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?)。唯一的区别是我创建了128 bpp float组件上下文,而不是通常的32 bpp上下文。从CGImageSource获得的源CGImage使用选项kCGImageSourceShouldAllowFloat创建。这样我希望能够访问与我的位图上下文的颜色空间匹配的浮点像素值,并在进一步的图像处理中使用它们。问题是所得到的图像数据似乎在失去动态范围。它可以在阴影,平原蓝天区域看到。它们变得轮廓化,缺乏细节。一些调查显示问题出现在CGContextDrawImage中(源CGImage包含完整的动态范围,通过CGImageDestination保存它证明了它)并且在CGContextDrawImage上下文内容变成了分色后。
经过一番调查,我发现了这个: http://lists.apple.com/archives/quartz-dev/2007/mar/msg00026.html 这使我得出结论,问题不在我的代码中,而在于核心图形或预期的行为。
我的问题是:使用核心图形从图像获取浮点数据的正确方法是什么?
答案 0 :(得分:0)
经过一些调查后,问题缩小到以下几点:当使用线性颜色空间(kCGColorSpaceGenericRGBLinear)创建的128 bpp浮点上下文绘制8位图像时,会发生分色。如果我将相同的图像绘制到使用kCGColorSpaceGenericRGB创建的上下文,则从该上下文检索CGImage并将第二个图像绘制到线性颜色空间上下文一切正常。
其他解决方案(解决方法?)是使用Core Image:从源CGImage创建CIImage并将其绘制到使用相应的kCGColorSpaceGenericRGBLinear CGContext创建的CIContext。但这只是OS X上的选项(不适用于iOS)。