Как стать автором
Поиск
Написать публикацию
Обновить

Картинки произвольной формы средствами WinAPI на С++

В этой статье я расскажу, как нарисовать картинку произвольной формы средствами WinAPI, без использования графических библиотек (типа OnenGL). В статье я буду отталкиваться от языка C++.
Иногда возникает такая задача, когда требуется нарисовать непрямоугольную картинку. Например, вы пишете игру (как было в моем случае), и вам нужно рисовать героев игры, но использовать графическую библиотеку по каким-то причинам нельзя. В этом случае вам поможет эта статья.

Возьмем простой пример: у вас есть какой-то фон с произвольным содержанием, вам нужно нарисовать на нем такую картинку:

image

Естественно, белый фон вокруг картинки нам не нужен. Как же его убрать? Для этого нам нужна будет маска:

image

Итак, сначала мы подгружаем картинки в файле ресурсов (*.rc):

KYLE BITMAP Kyle.bmp
KYLEMASK BITMAP KyleMask.bmp

И загружаем эти изображения в память с помощью функции LoadBitmap:
Kyle = LoadBitmap(hInstance, "KYLE");
KyleMask = LoadBitmap(hInstance, "KYLEMASK");

Где hInstance — идентификатор текущей копии приложения.
Далее при рисовании картинки мы сначала рисуем маску изображения:
DrawBitmap(hDC, X, Y, 0, 0, KyleMask, MERGEPAINT);

Где hDC — контекст отображения. При рисовании фона мы используем константу растровой операции MERGEPAINT, при использовании которой «выполняется логическая операции ИЛИ над инвертированным цветом исходного изображения и цветом фона».

Далее, мы рисуем непосредственно саму картинку на том же месте:

DrawBitmap(hDC, X, Y, 0, 0, Kyle, SRCAND);

В данном случае мы используем константу SRCAND, при использовании которой «цвет полученного изображения определяется при помощи логической операции И над цветом изображения и цветом фона „
Таким образом, что мы имеем в итоге? При использовании совместно, по сути, логических операций над пикселями MERGEPAINT и SRCAND, применительно к маске и основному изображению, мы получаем, что белая область основного изображения становится “прозрачной», т.е. принимает расцветку фона, а та часть изображения, которая попала на черную часть маски, оставляет свой цвет без изменений. Таким образом мы получили изображение произвольной формы.

Расход памяти при использовании этого метода составляет примерно 6000 Кб (3 картинки, описанные выше + картинка с фоном + прочее), что, я думаю, приемлемо для современных систем. Конечно, если у вас есть возможность использовать графическую библиотеку, то я рекомендую использовать ее.
Желаю удачи в работе!
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.