Конференция "Игры" » Помогите написать функцию альфа-бленда. [Delphi, Windows]
 
  • Псарь (25.12.11 17:43) [0]
    Нашел функцию BlendFunc для блендинга 24-битный изображений,
    но они должны быть одного размера.
    Подскажите как написать фукцию с телом Blit? (Думаю параметры ясны)

    З.Ы. Windows.AlphaBlend не хочу использовать.


    type
     PRGB = ^TRGB;
     TRGB = record
       R, G, B: byte;
     end;

    procedure BlendFunc(Bmp1, Bmp2: TBitmap; Alpha: byte);
    var
     i     : LongWord;
     P1, P2: PRGB;
    begin
     P1:= Bmp1.Scanline[Bmp1.Height - 1];
     P2:= Bmp2.Scanline[Bmp2.Height - 1];
     For i:= 0 to (Bmp1.Height * Bmp1.Width - 1) do
     begin
       P1.R:= (P1.R * (255 - Alpha) + P2.R * Alpha) shr 8;
       P1.G:= (P1.G * (255 - Alpha) + P2.G * Alpha) shr 8;
       P1.B:= (P1.B * (255 - Alpha) + P2.B * Alpha) shr 8;

       Inc(P1);
       Inc(P2);
     end;
    end;

    procedure Blit(X, Y: LongInt;
                      Dest,
                      Src: TBitmap;
                      Alpha: byte);
    var
     i     : LongWord;
     P1, P2: PRGB;
    begin
     
     // ?
    end;


  • MBo © (25.12.11 18:32) [1]
    BlendFunc у тебя неправильная - будет работать не на всех битмапах и не на всех их размерах.
    Для исправления достаточно использовать двойной цикл - по строкам в высоту и по каждой строке в ширину.
    Этот же подход сработает и для поставленной задачи (я так понял, что на кусок большого битмапа отрисовать маленький), разве что указатели на сканлайн надо ставить не в начало
  • Андреевич (25.12.11 19:03) [2]
 
Конференция "Игры" » Помогите написать функцию альфа-бленда. [Delphi, Windows]
Есть новые Нет новых   [134427   +38][b:0][p:0.002]