Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.09;
Скачать: CL | DM;

Вниз

Как наложить 32-х битный bitmap-спрайт?   Найти похожие ветки 

 
Sour Smile   (2006-01-31 10:56) [0]

Есть 32-х битный (4-х байтный) bitmap-спрайт, в каждом пикселе которого 3 байта обычные RGB, а 4-й - степень прозрачности пиксела (от 0 до 255).
Как можно прорисовать этот спрайт на другом битмапе (на заднем плане)? Или это нужно свою процедуру писать?


 
antonn ©   (2006-01-31 11:15) [1]

дарю (_B_in - спрайт, _B_out - задник, он должен быть 24 битный. Если надо, переделай и под 32 битный):
procedure CopyBitmapAlfa32to24(_B_in,_B_out:Tbitmap; _x,_y:integer);
const
 MaxPixelCountA = MaxInt div SizeOf(TRGBQuad);
 MaxPixelCount = MaxInt div SizeOf(TRGBTriple);
type
 PRGBArray = ^TRGBArray;
 TRGBArray = array[0..MaxPixelCount-1] of TRGBTriple;
 PRGBAArray = ^TRGBAArray;
 TRGBAArray = array[0..MaxPixelCountA-1] of TRGBQuad;
var x, y: Integer; _r,_b,_g:integer;
   w_in,h_in,w_out,h_out,tmp,x_cor,y_cor,x_corS,y_corS: Integer;
   RowOut:PRGBArray; RowIn:PRGBAArray;
   _d,_dd:double;
begin
w_in:=_B_in.Width;
h_in:=_B_in.Height;
w_out:=_B_out.Width;
h_out:=_B_out.Height;
if (_x)>w_out-1 then exit; if (_x+w_out)<0 then exit;
if (_y)>h_out-1 then exit; if (_y+h_out)<0 then exit;

if _x<0 then x_corS:=abs(_x) else x_corS:=0;
if _y<0 then y_corS:=abs(_y) else y_corS:=0;
if (_x+w_in)>w_out then x_cor:=_x+w_in-w_out else x_cor:=0;
if (_y+h_in)>h_out then y_cor:=_y+h_in-h_out else y_cor:=0;

 y_cor:=h_in-1-y_cor;
 tmp:=w_in-1-x_cor; _dd:=100/(255*100);
 for y:=y_corS to y_cor do begin
    RowOut:= _B_out.ScanLine[y+_y];
    RowIn:= _B_in.ScanLine[y];
   for x:=x_corS to tmp do begin
        _d:=RowIn[x].rgbReserved*_dd;

         _r:= trunc(RowOut[x+_x].rgbtRed+(RowIn[x].rgbRed-RowOut[x+_x].rgbtRed)*_d);
        if _r>255 then _r:=255 else if _r<0 then _r:=0;

        _g:= trunc(RowOut[x+_x].rgbtGreen+(RowIn[x].rgbGreen-RowOut[x+_x].rgbtGreen)*_d);
        if _g>255 then _g:=255 else if _g<0 then _g:=0;

        _b:= trunc(RowOut[x+_x].rgbtBlue+(RowIn[x].rgbBlue-RowOut[x+_x].rgbtBlue)*_d);
        if _b>255 then _b:=255 else if _b<0 then _b:=0;

         RowOut[x+_x].rgbtRed:=_r;
         RowOut[x+_x].rgbtGreen:=_g;
         RowOut[x+_x].rgbtBlue:=_b;

 end; end;
end;

использование:
CopyBitmapAlfa32to24(Bitmap,BackBitmap,10,10);


 
Sour Smile   (2006-01-31 12:36) [2]


> antonn ©   (31.01.06 11:15) [1]

Огромное спасибо!
Я видел твои сообщения здесь: http://delphimaster.net/view/8-1138362837/  :))

А вот если bitmap-спрайты находятся в TImageList, можно ли проделать чтото подобное?
(Если просмотреть dfm-файл на котором лежит TImageList с 32-х битными битмапами, то можно заметить, что сохраняются все 4 байта для каждого пиксела)


 
Gero ©   (2006-01-31 12:38) [3]

> А вот если bitmap-спрайты находятся в TImageList, можно
> ли проделать чтото подобное?

AFAIK, только под XP и выше. Лучше хранить в своем формате.


 
antonn ©   (2006-01-31 13:09) [4]

Sour Smile   (31.01.06 12:36) [2]
А вот если bitmap-спрайты находятся в TImageList, можно ли проделать чтото подобное?

не знаю, не пробывал:)
я свой класс создавал, мне TImageList почему то не очень нравится (хотя бы потому, что в него картинки неодинаковых размеров не положить, да и вообще...). Мне нужно было как раз картинки разных размеров где то хранить, удобно выводить, и хранить в едином файле(с zlib"ом еще и упаковывались). Правда без какого либо интерфейса и наглядности, как у TImageList"а.



Страницы: 1 вся ветка

Текущий архив: 2006.07.09;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
15-1149848331
Чапаев
2006-06-09 14:18
2006.07.09
Создать пользователя...


15-1149843485
RA
2006-06-09 12:58
2006.07.09
новая иконка.


15-1150129025
Yanis
2006-06-12 20:17
2006.07.09
Как то неожиданно вспомнилось...


11-1129736845
thaddy
2005-10-19 19:47
2006.07.09
Freepascal and kol 2.16 need change of ppDelphi s windows.pas


1-1148860928
Gamer
2006-05-29 04:02
2006.07.09
Прорблема с прорисовкой прокрутки ScrollBox a в WinXP