Является ли StretchBlt HALFTONE == BILINEAR для любого масштабирования? - PullRequest
5 голосов
/ 23 ноября 2010

Кто-нибудь может уточнить, выполняет ли функция GDI StretchBlt для рабочей станции Win32 API билинейную интерполяцию для масштабирования до и больших и меньших изображений для 24/32-битных цветных изображений? И если нет, то есть ли функция GDI ( not GDI +), которая делает это?

SetStretchBltMode fn имеет настройку HALFTONE , которая задокументирована следующим образом:

HALFTONE Отображает пиксели из исходного прямоугольника в блоки пикселей в целевом прямоугольнике. Средний цвет по целевому блоку пикселей приблизительно соответствует цвету исходных пикселей.

Я видел ссылки (см. Продолжение к первому ответу) , что это выполняет билинейную интерполяцию при уменьшении изображения, но нет четкого ответа о том, что происходит при увеличении.

Я заметил, что Windows Mobile CE SDK действительно поддерживает флаг BILINEAR - который задокументирован прямо напротив комментариев HALFTONE (работает только для увеличения).

Обратите внимание, что в рамках этого вопроса я не заинтересован в использовании GDI + (с многочисленными опциями интерполяции), OpenGL, DirectX и т. Д. В качестве альтернативы, поэтому, пожалуйста, не беспокойтесь о последующих мерах относительно этих других API или альтернативные библиотеки изображений.

Что я действительно надеюсь найти, так это какую-то определенную MS / MSDN или другую высококачественную документацию, которая четко документирует это поведение поведения Win32 (настольного компьютера) GDI.

Тем временем я попробую провести несколько экспериментов, сравнивающих GDI и Direct2D (у которых есть явный флаг для управления этим), и опубликую свои выводы.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 05 декабря 2010

Я изучал эту же проблему последние пару недель.

Насколько я могу судить, не существует какой-либо определенной документации по этому поведению от Microsoft.

Тем не менее, я сам провел несколько тестов, чтобы попытаться установить степень, в которой StretchBlt можно доверять для последовательной работы в отношении увеличения и уменьшения изображения в полутоновом режиме.* Мои выводы:

1) StretchBlt обеспечивает адекватное качество увеличенных и уменьшенных изображений.Это может быть прикосновение ниже качества Photoshop, но, вероятно, подходит для большинства практических целей.

2) Кажется, оно зависит от аппаратного ускорения, когда оно доступно.Я не смог подтвердить это, но у меня есть небольшой страх, что это может привести к различным результатам на разных типах оборудования.Однако на 5 или 6 различных системах, на которых я его пробовал, старых и новых, производительность была стабильной и быстрой.

3) Если вы используете вызов на 16-битном цветном устройстве, илиниже StretchBlt автоматически поменяет ваше изображение.Если вы запустите его на 24-битном цветном устройстве, оно не будет колебаться.

4) Если вы используете его для масштабирования небольших изображений (размером менее 150x150 пикселей), он будет случайным образом возвращаться к интерполяции ближайшего соседа.Это можно исправить в вашем собственном программном обеспечении, добавив растровое изображение перед масштабированием, выполнив для него StretchBlt, а затем удалив заполнение.Вроде хак, но это работает.

0 голосов
/ 23 ноября 2010

Режим HALFTONE выполняет очень блочное полутоновое сглаживание на изображении, основываясь на изменении пороговых значений преобразования по определенному квадрату.Я никогда не сталкивался с ситуацией, когда это было бы лучшим выбором.

COLORONCOLOR - лучший режим для цветных изображений, но, как вы видели, он не дает хороших результатов.

GDI не поддерживает билинейный режим (за исключением Windows Mobile CE, как вы обнаружили).Наивная реализация билинейной не очень хорошо работает при сжатии изображения, поскольку она просто пытается интерполировать между двумя смежными входными пикселями, не пытаясь рисовать из большей области.

...