Конференция "Игры" » Как вывести на поверхность картинку с альфа-каналом? [Delphi, Windows]
 
  • Леночка (17.11.11 14:52) [0]
    Есть рисунок с альфа-каналом (32bit-BMP). Рисунок "по краям" имеет пискселы различной прозрачности, что позволяет ему красиво смотреться на любом фоне.... хочется вывести его на игровую поверхность... а не знаю как... (((( И можно ли вместо BMP использовать PNG? Если да, то как?
  • Rouse_ © (17.11.11 15:58) [1]
    AlphaBlend, но иногда выдает артефакты, поэтому можно ручками.
    В этом примере из иконки вытаскивается PBitmapInfoHeader и отрисовывается самостоятельно.
    http://rouse.drkb.ru/components.php#fwiconex
  • Леночка (17.11.11 18:58) [2]
    О! Это наверное то, что мне нужно.... Наверное, потому, что не до конца понимаю написанный код. )) Ну чайница, я немного )))) Извините. )))
    Нутром чую, что мне нужно вот это:

    procedure MakeAlphaBlend(DIBColorSrc, DIBDest: PRGBQuad;
     const DIBColorSrcSize: Integer);  
    var
     I: Integer;
    begin
     for I := 0 to (DIBColorSrcSize shr 2) - 1 do
     begin
       if DIBColorSrc^.rgbReserved = 255 then
         DIBDest^ := DIBColorSrc^
       else
         if DIBColorSrc^.rgbReserved > 0 then
         begin
           DIBDest^.rgbBlue := Byte(MulDiv(DIBColorSrc^.rgbBlue,
             DIBColorSrc^.rgbReserved, 255)
             + MulDiv(DIBDest^.rgbBlue, 255 - DIBColorSrc^.rgbReserved, 255));
           DIBDest^.rgbGreen := Byte(MulDiv(DIBColorSrc^.rgbGreen,
             DIBColorSrc^.rgbReserved, 255)
             + MulDiv(DIBDest^.rgbGreen, 255 - DIBColorSrc^.rgbReserved, 255));
           DIBDest^.rgbRed := Byte(MulDiv(DIBColorSrc^.rgbRed,
             DIBColorSrc^.rgbReserved, 255)
             + MulDiv(DIBDest^.rgbRed, 255 - DIBColorSrc^.rgbReserved, 255));
         end;
       Inc(DIBDest);
       Inc(DIBColorSrc);
     end;
    end;



    только не могу понять как мне это использовать....

    что такое PRGBQuad? это указатель для структуры ARGB? и где rgbReserved - значение альфаканала?

    а что такое DIBColorSrcSize? 8(

    я себе представляла функцию типа
    function ToAlphaBlend(SourceBmp, TargetBmp:TBitmap):TBitmap;
    результатом которой есть битмап полученый наложением SourceBmp на TargetBmp с учетом альфа-канала.....

    Можно ли такое получить? .....
  • Андреевич (17.11.11 19:00) [3]
    может это поможет http://desksoft.ru/index.php?forum=13&th=269
  • Rouse_ © (17.11.11 20:39) [4]

    > я себе представляла функцию типа
    > function ToAlphaBlend(SourceBmp, TargetBmp:TBitmap):TBitmap;
    >
    > результатом которой есть битмап полученый наложением SourceBmp
    > на TargetBmp с учетом альфа-канала.....
    >

    Ну собственно это оно и есть, берется битовая карта цвета источника и  результирующего канваса и микшируется...
    Собственно у тебя задача просто вникнуть в код и разобраться как это работает.
  • Леночка (17.11.11 21:38) [5]
    Немного разобралась с вторым примером.... там код проще )))

    изучила функцию

    procedure Copy32to32_Bitmap(B_in: tbitmap; Bout: tbitmap; X, Y: Integer);
    var
     cy, cx: Integer;
     RowOut, Row1, Row2, Row3, Row4: PRGBAArray;
    begin
     if (Bout.Width < B_in.Width + X) then
       Bout.Width := B_in.Width + X;

     if (Bout.Height < B_in.Height + Y) then
       Bout.Height := B_in.Height + Y;

     for cy := 0 to B_in.Height - 1 do
     begin
       Row1 := B_in.ScanLine[cy];
       RowOut := Bout.ScanLine[cy + Y];
       for cx := 0 to B_in.Width - 1 do
       begin
         RowOut[cx + X] := Row1[cx];
       end;
     end;
    end;



    и поняла (ScanLine!) как можно получить байт отвечающий за альфаканал!
  • None (10.04.12 08:45) [6]
    Леночка! =)

    ScanLine[] - это всего лишь функция-метод из VCL. И оно там сделано довольно криво.

    Не знаю насколько давно вы в программировании, но нужно сначала понимать работу с массивом через указатели) И вот тогда станет всё абсолютно понятно и можно будет ещё и не такие фокусы выделывать!)

    Функция AlphaBlend(), или точнее приходится писать Windows.AlphaBlend() работает тоже довольно криво и медленно, но она не выдает артефактов - просто для полупрозрачных она требует предварительно обработанного (искажённого) битмапа и если это требование не выполнено - получите по заслугам. =)

    > результатом которой есть битмап полученый наложением SourceBmp на TargetBmp с учетом альфа-канала.....


    Я могу сделать что угодно и как угодно (VCL/API), только поясните что именно требуется и на чём?) Вот какого формата (24b/32b) каждый из тех картинок?
  • Jimmy (13.05.12 22:58) [7]
    Вроде бы всё намного проще: Image1.Draw(0,0,TP); где TP:TPNGObject из PNGImage, 32-битный.
  • V (21.05.12 20:37) [8]
    Опять некроманты проснулись. PNGImage, кстати, входит в стандартную поставку?
  • Rouse_ © (21.05.12 20:43) [9]

    > PNGImage, кстати, входит в стандартную поставку?

    Зависит от версии дельфи.
  • имя (27.04.13 20:02) [10]
    Удалено модератором
  • имя (27.04.13 20:02) [11]
    Удалено модератором
 
Конференция "Игры" » Как вывести на поверхность картинку с альфа-каналом? [Delphi, Windows]
Есть новые Нет новых   [134427   +38][b:0][p:0.002]