Форум: "Media";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
ВнизКак наложить 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 вся ветка
Форум: "Media";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c