Назад |
скачай демо-проект pepper-head.rar (59,2 кб)
Знания СОВУ (Совершенно Обычный Волшебный Уровень) являются базовыми и без них ты не сможешь разобраться ни в уровне ПАУК, ни, тем более, в боевой магии. Как всегда, чтобы в чем-то хорошо разобраться, надо сделать все своими ручками. И сейчас мы разберем ручное создание эффекта прозрачности изображения. Кроме весьма полезного опыта, сотворенный нами код будет полезен начинающим кодерам графических редакторов.
Итак формула прозрачности у нас уже есть. Сейчас мы с ее помощью для разминки пальцев составим Перцеголовую Чару. Кроме профессора нам для работы потребуется перец, выращенный, конечно, на огороде Хагрида. Заклинание будет заключаться в следующем: на фон нежного пастельного цвета мы сначала наложим полупрозрачного Дамблдора, а затем на получившийся рисунок на место дамблдоровой головы наложим полупрозрачное изображение перца. В приложенном свитке с демонстрацией можно менять степень прозрачности накладываемых изображений.
При наложении мы будем использовать единую прозрачность для всего изображения (без чресписксельной прозрачности). Поэтому формула немного упростится:
Образы волшебника, перца и фон поместим на форму в виде TImage. Изображения у нас окружены яркими цветами. Эти цвета нам нужны в качестве прозрачных ключей, чтобы при наложении убрать фон с исходных картинок. То есть мы применим сразу оба типа прозрачности – и по цветовому ключу, и альфа-смешивание.
Вот основная функция смешивания изображений:
procedure BlendImage(X,Y: Integer;
SourceImage, DestinationImage: TImage;
Alpha: Byte;
TransparentColor: TColor);
var
xx, yy: Integer;
Transparency: Byte;
begin
for xx := 0 to SourceImage.Width - 1 do
for yy := 0 to SourceImage.Height - 1 do
begin
// Устанавливаем полную прозрачность для фона
if SourceImage.Canvas.Pixels[xx,yy] = TransparentColor then
Transparency := 0
else
Transparency := Alpha;
// Проводим смешивание
DestinationImage.Canvas.Pixels[xx + X, yy + Y] :=
BlendColor(SourceImage.Canvas.Pixels[xx,yy],
DestinationImage.Canvas.Pixels[xx + X, yy + Y], Transparency);
end;
end;
В функцию передаем рисунок-источник и рисунок, на который будем накладывать изображение. X и Y – координаты верхнего левого угла рисунка-источника на целевом рисунке. CommonAlpha – общая прозрачность рисунка (0..255, при 255 – непрозрачный рисунок). TransparentColor – прозрачный цвет. Используем его, чтобы убрать фон с рисунка источника.
Доступ к пикселям рисунков осуществляем с помощью свойства Canvas.Pixels[]. Обходим в цикле все точки рисунка-источника, получаем их цвет. Если цвет соответствует TransparentColor, то устанавливаем полную прозрачность (Transparency) пикселя, иначе она равна CommonAlpha. Дальше проводим смешивание цветов картинок и устанавливаем новый цвет пикселя. Смешивание проводит функция BlendColor:
function BlendColor(SColor, DColor: TColor; CommonAlpha: Byte): TColor;
var
r, g, b: Byte;
begin
r := Round((GetRValue(SColor) * CommonAlpha / 256) +
GetRValue(DColor) * (1 - CommonAlpha /256));
g := Round((GetGValue(SColor) * CommonAlpha / 256) +
GetGValue(DColor) * (1 - CommonAlpha/256));
b := Round((GetBValue(SColor) * CommonAlpha / 256) +
GetBValue(DColor) * (1 - CommonAlpha /256));
Result := RGB(r,g,b);
end;
Она получает два цвета и смешивает их с учетом прозрачности. Собственно тут и применяется формула прозрачности.
Поочередно вызовем функцию BlendImage для Дамблдора и перца. Получился перцеголовый Дамлдор. Все! Заклинание готово. Подробности реализации смотри в приложенном демонстрационном свитке.
Сразу надо отметить, что свойство канвы Pixels[] использует функции Windows API – GetPixel и SetPixel. Но эти функции работают просто кошмарно медленно. Перейдя на новый уровень, ты узнаешь как существенно оптимизировать код заклинания и заставить его работать намного быстрее.
Орехов Роман also known as tripsin © 2006
tripsin@yandex.ru
Назад |