Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.013 c
2-1150790849
zdm
2006-06-20 12:07
2006.07.09
глупый вопрос


2-1151035731
Mir
2006-06-23 08:08
2006.07.09
Выполнение команды через shellexecute


4-1143729890
Lik
2006-03-30 18:44
2006.07.09
Проблема с RasEnumConnections


6-1141307342
wezzz
2006-03-02 16:49
2006.07.09
как получить сетевое имя файла?


15-1150125324
antonn
2006-06-12 19:15
2006.07.09
Помогите на англицкий перевести...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский