страничка tripsin'а


Главная | Статьи | Заметки | Файлы| Ссылки | я

Назад

Дальше

Формула Прозрачности или Прозрачная Магия

Уровень «СОВУ»: Перцеголовая чара.

скачай демо-проект  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

Назад

Дальше

Hosted by uCoz