Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  3 670

•  TDictionary Custom Sort  5 800

•  Fast Watermark Sources  5 603

•  3D Designer  8 218

•  Sik Screen Capture  5 913

•  Patch Maker  6 388

•  Айболит (remote control)  6 378

•  ListBox Drag & Drop  5 237

•  Доска для игры Реверси  94 551

•  Графические эффекты  6 570

•  Рисование по маске  5 644

•  Перетаскивание изображений  4 760

•  Canvas Drawing  5 135

•  Рисование Луны  4 863

•  Поворот изображения  4 411

•  Рисование стержней  3 116

•  Paint on Shape  2 360

•  Генератор кроссвордов  3 228

•  Головоломка Paletto  2 551

•  Теорема Монжа об окружностях  3 328

•  Пазл Numbrix  2 200

•  Заборы и коммивояжеры  2 849

•  Игра HIP  1 820

•  Игра Go (Го)  1 740

•  Симулятор лифта  2 072

•  Программа укладки плитки  1 798

•  Генератор лабиринта  2 240

•  Проверка числового ввода  1 925

•  HEX View  2 226

•  Физический маятник  1 911

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Изменение гаммы спрайта



Оформил: XVeL
Автор: Spose&Daddy

Для чего это нужно. Эту технологию можно использовать для выделения "юнита", или для выделения пункта меню. Одним словом для обозначения чего-либо.
Ну что не поняли? Показываю:
             стандартный спрайт : спрайт с измененной гаммой


Как это делатся. Динамически создается новый спрайт с подложкой нужного цвета (фон) и на него накладывается с использованием Альфа смешения наш спрайт. Чем больше величина Альфа, тем больше будет "проявляться" фон, соответственно, если "фон" белый - спрайт будет осветляться.
Что касается TransparentColor - если фоновый цвет спрайта будет отличаться от "подложки" создаваемого спрайта, то придется подумать как определить новый TransparentColor. Можно конечно заранее его просчитать и использовать, а можно просчитать динамически, взяв, например, цвет фоновой точки (посмотрите координаты какой нибудь из них в редакторе) в полученном спрайте.

Посмотрим на примере.
Эта процедурка реализует алгоритм описанный выше.

procedure Tform1.createmmap(Color:Tcolor;alpha:byte);
var
   NG : TDIB;
   Item: TPictureCollectionItem;
   tm:Tdirectdrawsurface;
   i:integer;
   est:boolean; //Присутствует ли уже измененная картика в списке
   TC:TColor; //TransparentColor
begin
   ng:=tdib.Create; //Создаем картинку (пустую)
   tm:=Tdirectdrawsurface.Create(DXDraw.Surface.DDraw); //Создаем поверхность
   tm.SystemMemory:=false;
   tm.SetSize(il.Items[0].Width,il.Items[0].height); //Устанавливаем размер поверхности по размеру исходной картинки
   tm.Fill(color); //Заполняем фон нужным цветом
   il.Items[0].DrawAlpha(tm,bounds(0,0,il.Items[0].width,il.Items[0].height),0,alpha); //Рисуем исходную картинку на фон с прозрачностью
   tm.AssignTo(ng); //Сохраняем изображение в картинку (создана первой строкой)
   tm.Free; //Очищаем память от поверхности
   TC:=ng.Canvas.Pixels[0,0]; //Возьмем цвет точки 0,0 в качестве TransparentColor для нового спрайта
   est:=false; //Ставим на нет, то что картинка уже есть в списке
   for i:=0 to il.Items.Count-1 do //Если же она есть
   if il.Items[i].Name='MMG' then est:=true; //ТО Ставим на Да
   if est then //Если ДА то
   begin //Изменяем уже существующую картинку
      item:=il.Items.Find('MMG');
      item.Picture.Graphic := ng;
      item.TransparentColor:=TC;
      item.Transparent:=true;
      item.Restore;
   end
   else
   begin //Если же Нет, то заносим в список новую!
      Item := TPictureCollectionItem.Create(IL.Items);
      Item.Name:='MMG';
      Item.SystemMemory:=false;
      Item.Picture.Graphic := ng;
      Item.TransparentColor:=TC;
      Item.Transparent:=true;
      Item.Restore;
   end;
end;

Вот и все. Возмите этот готовый примерчик.




Похожие по теме исходники

Изменение цвета изображения




Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте