Эффект постеризации при использовании CGContextDrawImage, float CGBitmapContext - PullRequest
0 голосов
/ 04 мая 2011

Чтобы получить значения пикселей из CGImage, я использую CGContextDrawImage (как описано здесь: Как получить данные пикселей из UIImage (Cocoa Touch) или CGImage (Core Graphics)? ).Единственное отличие состоит в том, что я создаю контекст с плавающей точкой 128 бит / бит, а не обычный контекст 32 бит / бит.Исходный CGImage, полученный из CGImageSource, создан с опцией kCGImageSourceShouldAllowFloat.Таким образом я надеялся получить доступ к цвету значений плавающего пикселя, согласованному с цветовым пространством моего растрового контекста, и использовать их в дальнейшей обработке изображения.Проблема заключается в том, что полученные данные изображения теряют динамический диапазон.Это можно увидеть в тени, на равнинах голубого неба.Они становятся очерченными и лишенными деталей.Некоторые исследования показали, что проблема возникает в CGContextDrawImage (исходный CGImage содержит полный динамический диапазон, сохранение его с помощью CGImageDestination доказывает это) и после того, как содержимое контекста CGContextDrawImage стало постеризованным.

После еще одного исследования я обнаружил следующее: http://lists.apple.com/archives/quartz-dev/2007/mar/msg00026.html Это привело меня к выводу, что проблема не в моем коде, а в основной графике или в предполагаемом поведении.

Мой вопрос: как правильно получить данные с плавающей запятой из изображения с использованием базовой графики?

1 Ответ

0 голосов
/ 04 мая 2011

После еще одного исследования проблема сужается до следующего: постеризация происходит, когда 8-битное изображение рисуется в плавающий контекст 128 бит / с, созданный с линейным цветовым пространством (kCGColorSpaceGenericRGBLinear). Если я рисую то же изображение в контексте, созданном с помощью kCGColorSpaceGenericRGB, то извлекаю CGImage из этого контекста и рисую второе изображение в контексте линейного цветового пространства, все в порядке.

Другое решение (обходной путь?) Заключается в использовании Core Image: создайте CIImage из исходного CGImage и перетяните его в CIContext, созданный с помощью соответствующего kCGColorSpaceGenericRGBLinear CGContext. Но это единственный вариант в OS X (не в iOS).

...