-
Леночка (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]Удалено модератором