Аннотация:
Рассматриваются вопросы прозрачности и полупрозрачности при работе с растровой графикой методами GDI. Приведены практические приемы работы с учетом специфики Windows 95, Windows 98, Windows 2000.
Все мы начинающие. Не учаться только дураки. Для меня GDI+ новое и я очень рад таким статьям.Всезнающим предлагаю писать прямо в машинных кодах или при помощи приснопамятной утилиты debug (DOS 1-6.22)
Без GDI+... В этом случае многое придется сделать руками. Например, создать DIB Section и заполнить его пикселы 32-битными значениями цветов с альфа-каналом, а затем уже воспользоваться AlphaBlend. При этом отрезки линий, составляющих полигон, придется "рисовать" самостоятельно.
Можно также создать In-Memory HDC, нарисовать в него полигон, а затем уже анализировать полученный растр.
Пример создания такого растра (DIB) есть в демонстрационном проекте к статье.
Советую взглянуть также на функцию RasterAlphaBlend (http://www.rsdn.ru/files/?Functions/rasterab.xml), облегчающую вывод растров, созданных в памяти.
Статья-то конечно хорошая, но с какой-то точки зрения она демонстрирует беспомощность GDI. Если нужно нечто большее, чем нарисовать готовый битмап с готовой же альфой (или что-то легко вычисляемое), то лучше пользоваться другими библиотеками.
Мелочные придирки.
— В демо-проекте нужно явно заливать белым фон, т.к. вся демо-графика сделана в расчете на белый фон.
— Иллюстрация режимов 1-битной прозрачности может создать иллюзию, что она (1-бит. прозрачность) не так уж плоха. Опять же из-за того, что исходные картинки сделаны с анти-элайзингом для белого фона и выводятся на белый.
— Ну и Chroma Key'ем пожалуй называют нечто попрактичней и посложнее.
Здравствуйте, rborisov, Вы писали:
R>Вывод полупрозрачных картинок это хорошо. R>А не подскажите как мне вывести полупрозрачный полигон (без GDI+)? R>Заранее признателен.
Ну если очень нужно выводить сложные вещи, не делая отрисовок примитивов руками, можно завести 2 параллельных конвейера для RGB и для маски в двух DC. В DC для RGB рендерить как обычно. В DC для маски рендерить с расчетом, что, допустим, красная компонента битмапа из этого DC будет маской. Т.е. использовать в этом DC свои Pen'ы, Brush'и и пр. для рисования ими в маске. А потом все это комбинировать после отрисовки. Такие фантазии. Но лучше, дешевле просто использовать другую библиотеку, не GDI.