簡體   English   中英

使用CGContextDrawImage時的海報化效果,浮動CGBitmapContext

[英]Posterization effect when using CGContextDrawImage, float CGBitmapContext

要從 CGImage 中檢索像素值,我使用 CGContextDrawImage (如下所述: 如何從 UIImage (Cocoa Touch) 或 CGImage (Core Graphics) 獲取像素數據? )。 唯一的區別是我創建了 128 bpp 浮動組件上下文,而不是通常的 32 bpp 上下文。 從使用選項 kCGImageSourceShouldAllowFloat 創建的 CGImageSource 獲得的源 CGImage。 這樣,我希望能夠訪問與我的 bitmap 上下文顏色空間匹配的浮點像素值,並將它們用於進一步的圖像處理。 問題是生成的圖像數據似乎正在失去動態范圍。 它可以在陰影、純藍天區域看到。 它們變得輪廓分明,缺乏細節。 一些調查表明問題發生在 CGContextDrawImage (源 CGImage 包含完整的動態范圍,通過 CGImageDestination 保存它證明了這一點)和 CGContextDrawImage 上下文內容變得分色后。

經過更多調查后,我發現: http://lists.apple.com/archives/quartz-dev/2007/mar/msg00026.html這使我得出結論,問題不在我的代碼中,而在核心圖形中預期的行為。

我的問題是:使用核心圖形從圖像中獲取浮點數據的正確方法是什么?

經過一些進一步的調查,問題被縮小到以下問題:當 8 位圖像被繪制到使用線性顏色空間 (kCGColorSpaceGenericRGBLinear) 創建的 128 bpp 浮點上下文時,會發生分色。 如果我將相同的圖像繪制到使用 kCGColorSpaceGenericRGB 創建的上下文中,然后從該上下文中檢索 CGImage 並將第二個圖像繪制到線性顏色空間上下文中,一切正常。

其他解決方案(解決方法?)是使用 Core Image:從源 CGImage 創建 CIImage 並將其繪制到使用相應的 kCGColorSpaceGenericRGBLinear CGContext 創建的 CIContext。 但這是 OS X 上的唯一選項(不在 iOS 上)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM