Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Установка уровня прозрачности изображения

Delphi , Графика и Игры , Bitmap

Установка уровня прозрачности изображения

Автор: Fenik
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Установка уровня прозрачности изображения

Зависимости: Windows, Graphics, Math
Автор:       Fenik, chook_nu@uraltc.ru, Новоуральск
Copyright:   Автор Федоровских Николай
Дата:        3 сентября 2002 г.
***************************************************** }

procedure BlendBitmap(Src, Dest: TBitmap; Amount: Byte; Left, Top:
  Integer; BackColor: TColor; Transparent: Boolean);
  function CandC(C1, C2: TRGBTriple): Boolean;
  begin {Сравнение двух цветов}
    Result := (C1.rgbtBlue = C2.rgbtBlue) and
      (C1.rgbtGreen = C2.rgbtGreen) and
      (C1.rgbtRed = C2.rgbtRed);
  end;
  {Процедура установления уровня прозрачности
   изображения Dest, расположенного над изображением Src.
   Amount - уровень прозрачности в промежутке [0..255].
   Left, Top - левый верхний угол Dest.
   BackColor - цвет, который не нужно изменять,
   если Transparent = True.}
var
  x, y, y1, y2, x1, x2: Integer;
  ps, pd: pRGBTriple;
  rgb: TRGBTriple;
  A1, A2: Double;
begin
  Src.PixelFormat := pf24Bit;
  Dest.PixelFormat := pf24Bit;
  A1 := Amount / 255;
  A2 := 1 - A1;
  {Изменяется только та часть изображения,
   которая расположена над исходным}
  y1 := Max(0, Top);
  x1 := Max(0, Left);
  x2 := Min(Src.Width - 1, Left + Dest.Width - 1);
  y2 := Min(Src.Height - 1, Top + Dest.Height - 1);
  rgb.rgbtRed := Lo(BackColor);
  rgb.rgbtGreen := Lo(BackColor shr 8);
  rgb.rgbtBlue := Lo((BackColor shr 8) shr 8);
  for y := y1 to y2 do
  begin
    ps := Src.ScanLine[y];
    pd := Dest.ScanLine[y - Top];
    Inc(ps, x1);
    if Left < 0 then
      Inc(pd, Abs(Left));
    for x := x1 to x2 do
    begin
      if not (Transparent and CandC(pd^, rgb)) then
        with pd^ do
        begin
          rgbtBlue := Round(A1 * ps^.rgbtBlue + A2 * rgbtBlue);
          rgbtGreen := Round(A1 * ps^.rgbtGreen + A2 * rgbtGreen);
          rgbtRed := Round(A1 * ps^.rgbtRed + A2 * rgbtRed);
        end;
      Inc(pd);
      Inc(ps);
    end;
  end;
end;

Пример использования:

var
  Bmp: TBitmap;
begin
  if not FileExists('C:\Blend.bmp') then
    Exit;
  Bmp := TBitmap.Create;
  try
    Bmp.LoadFromFile('C:\Blend.bmp');
    BlendBitmap(FBitmap, Bmp, 127, 10, 10, clWhite, True);
    Bmp.TransparentColor := clWhite;
    Bmp.Transparent := True;
    FBitmap.Canvas.Draw(10, 10, Bmp);
  finally
    Bmp.Free;
  end;
  Paint;
end;

Программный код на языке Delphi, демонстрирующий способ смешивания двух битмапов с использованием прозрачности. Процедура BlendBitmap принимает следующие параметры:

  • Src: исходный битмап
  • Dest: целевой битмап
  • Amount: уровень прозрачности (значение между 0 и 255)
  • Left, Top: координаты верхнего левого угла целевого битмапа
  • BackColor: цвет, который не должен изменяться при Transparent = True
  • Transparent: логическое флаг, указывающее, нужно ли сохранять оригинальные цвета или нет

Процедура работает, итерируя по каждому пикселю в целевом битмапе, и для каждого пикселя вычисляет смешанный цвет на основе исходного пикселя и уровня прозрачности. Если флаг Transparent установлен в True, то она сохраняет оригинальный цвет пикселя целевого битмапа, если соответствующий пиксель источника имеет те же RGB-значения.

Пример использования демонстрирует, как загрузить файл битмапа, смешать его с другим битмапом и затем нарисовать результат на канвасе.

Некоторые предложения по улучшению кода:

  • Код может быть более эффективным, если использовать указатели вместо индексации массивов. Например, ps и pd могут быть указателями типа PTRGBTriple.
  • Функция CandC не необходима; она может быть заменена простым сравнением RGB-значений.
  • Переменные цикла x и y объявлены как целые, но они только принимают целочисленные значения. Рекомендуется объявить их как LongInt, чтобы избежать потенциальных проблем с большими размерами изображения.
  • Код может быть более читаемым, если добавить пробелы и отступы согласованно по всему коду.

В целом, это хороший пример смешивания битмапов с использованием прозрачности в Delphi и демонстрирует некоторые полезные техники для работы с изображениями в программировании.

Установка уровня прозрачности изображения позволяет изменять уровень прозрачности части изображения Dest, расположенной над исходным изображением Src.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Bitmap ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-06-02 10:20:12
2024-06-14 05:15:46/0.0048599243164062/2