0

CGImage からピクセル値を取得するには、CGContextDrawImage を使用します (ここで説明したように: UIImage (Cocoa Touch) または CGImage (Core Graphics) からピクセル データを取得する方法は?)。唯一の違いは、通常の 32 bpp コンテキストではなく、128 bpp float コンポーネント コンテキストを作成することです。オプション kCGImageSourceShouldAllowFloat で作成された CGImageSource から取得されたソース CGImage。そうすれば、ビットマップ コンテキストの色空間と一致する float ピクセル値の色にアクセスし、それらをさらに画像処理に使用したいと考えていました。問題は、結果の画像データがダイナミック レンジを失っているように見えることです。影のある、真っ青な空の領域で見ることができます。それらは輪郭があり、細部が欠けています。一部の調査では、問題が CGContextDrawImage (ソース CGImage にはフル ダイナミック レンジが含まれており、CGImageDestination を介して保存することで証明されます) で発生し、CGContextDrawImage コンテキスト コンテンツがポスタライズされた後に発生することが示されました。

さらに調査した結果、次のこと がわかりました。 意図した動作。

私の質問は: コア グラフィックスを使用して画像から浮動小数点データを取得する正しい方法は何ですか?

4

1 に答える 1

0

さらに調査した結果、問題は次のように絞り込まれました。リニア カラー スペース (kCGColorSpaceGenericRGBLinear) で作成された 128 bpp float コンテキストに 8 ビット イメージが描画されると、ポスタリゼーションが発生します。kCGColorSpaceGenericRGB で作成されたコンテキストに同じ画像を描画すると、そのコンテキストから CGImage を取得し、その 2 番目の画像を線形色空間コンテキストに描画すると、すべて問題ありません。

他の解決策 (回避策 ?) は Core Image を使用することです: ソース CGImage から CIImage を作成し、対応する kCGColorSpaceGenericRGBLinear CGContext で作成された CIContext に描画します。ただし、OS X での唯一のオプションです (iOS ではありません)。

于 2011-05-04T18:32:41.817 に答える