Альфа-наложение

Альфа-наложением (alpha blending) называется методика графического вывода, в которой пиксель вычисляется в виде взвешенной суммы двух пикселов (источника и приемника). Весовой коэффицент источника обычно называется альфа-коэффицентом(a). Нулевой альфа-коэффицент соответствует абсолютно прозрачным пикселам источника, а единичным – полностью непрозрачным пикселам. Т.е. представьте ситуацию: вы нарисовали два прямоугольника и один из них перекрыл другой. Теперь в том месте, где эти прямоугольники пересеклись, будет виден только тот, который был выведен последним. С помощью альфа-наложения можно было бы вывести эти прямоугольники полупрозрачными, чтобы их оба было видно. Вот об этом мы сейчас и поговорим.

Альфа-наложение относится к числу новых возможностей, появившихся в Windows 98 и Windows 2000. Вся поддержка состоит из одной структуры и одной функции.

                        typedef struct _BLENDFUNCTION {

                                    BYTE BlendOp;

                                   BYTE BlendFlags;

BYTE SouyrceConstantAlpha;

BYTE AlphaFormat;

                        } BLENDFUNCTION;

BOOL AlphaBlend(HDC hdcDesk, int nXOriginDest,int nYOriginDesk,

                               int nWidthDest, int nHeightDest,

                               HDC hdcSrc, int nXOriginSrc int nYOriginSrc,

                               int nWidthSrc, int nHeightSrc,

                               BLENDFUNCTION blendFDunction);

Как вы сами уже, наверное, поняли, это их API – прототип. Потом я покажу, как это при помощи MFC написать. А теперь разберемся с параметрами. Для начала возьмем структуру. Поле BlendOp должно быть AC_SRC_OVER. Поле BlendFlags – 0. Поле SouyrceConstantAlpha может быть от 0 до 255, в зависимости от прозрачности. Поле AlphaFormat может быть 0, при постоянном альфа-коэффиценте, а может быть AC_SRC_ALPHA. Но мы рассмотрим только первый вариант. Теперь время пришло и для самой функции. Первые 5 параметров определяют контекст устройства и прямоугольник приемной поверхности. Прошу обратить внимание: 3 и 4 параметры это не координата, а расстояние от первой точки, которая задается 2 и 3 параметрами. Следующие 5 параметров определяют контекст устройства источника и прямоугольник. Прошу опять-таки обратить внимание на 9 и 10 параметры. И последний параметр – структура BLENDFUNCTION.

            А теперь пример:

                        CclientDC dc(this);

                        CBrush b(RGB(0,255,255));

                        dc.SelectObject(b);

                        dc.Rectangle(0,0,100,100);

                        BLENDFUNCTION blend={AC_SRC_OVER,0,255/2,0};

                        dc.AlphaBlend(100,100,100,100,&dc,0,0,100,100,blend);

            Этот пример написан с использованием MFC. Он просто рисует квадрат (0,0,100,100), а потом этот же квадрат рисуется от 100,100 до 200,200, но уже полупрозрачным. Я думаю, смысл вам понятен. Можно было бы нарисовать еще один квадрат и потом с помощью альфа-наложения изобразить их, чтобы один из них перекрывал другого. Тогда будут видны оба прямоугольника. Но в этом не главная прелесть альфа-наложения. Если выводить в одно и тоже место какую-то фигуру, допустим с коэффициентом  a равным 50, то через 5-6 выводов будет полностью непрозрачная фигура. Так можно реализовать эффект постепенного появления, что выглядит довольно эффектно. Но я думаю, вы сами с этим разберетесь, ведь это не такая сложная тема (всего же 1 функция).