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

Вниз

Transparency   Найти похожие ветки 

 
NieL   (2008-02-24 21:43) [0]

Как можно определить прозрачности на Bitmap32?


 
antonn ©   (2008-02-24 23:27) [1]

первые три байта - BGR, первый - A (альфаканал).


 
antonn ©   (2008-02-24 23:28) [2]

т.е. последний альфаканал, но первый в записи :)
ARGB


 
NieL   (2008-02-24 23:34) [3]

Alpha канал определил. Как теперь вывести прозрачный bitmap. (наложить его на другой убрав белую область) . С графикой раньше работать не приходилось.


 
antonn ©   (2008-02-24 23:41) [4]


> (наложить его на другой убрав белую область)

какую белую область? альфаканал это значение прозрачности 0..255, это не "прозрачный цвет". Могу предложить баянистую процедурку:
procedure CopyBitmapAlfa32to32(var _B_in,_B_out:Tbitmap; _x,_y:integer);
const
 MaxPixelCountA = MaxInt div SizeOf(TRGBQuad);
type
 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,RowIn:PRGBAArray;
   _d,_dd:double;
begin
try
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].rgbRed+(RowIn[x].rgbRed-RowOut[x+_x].rgbRed)*_d);
        if _r>255 then _r:=255 else if _r<0 then _r:=0;

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

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

         RowOut[x+_x].rgbRed:=_r;
         RowOut[x+_x].rgbGreen:=_g;
         RowOut[x+_x].rgbBlue:=_b;
       if RowOut[x+_x].rgbReserved<(RowIn[x].rgbReserved) then RowOut[x+_x].rgbReserved:=RowIn[x].rgbReserved;

 end; end;
 except

 end;
end;

первый битмап копируется на второй по координатам X,Y. Оба битмапа должны быть 32 битными. Результирующая альфа складывается из максимальной альфы двух картинок.



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

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

Наверх




Память: 0.48 MB
Время: 0.014 c
2-1203592121
Евгений Т.
2008-02-21 14:08
2008.03.23
Искать похожие слова


2-1204018478
Neket
2008-02-26 12:34
2008.03.23
Delphi vs Макросы Excel


15-1202610413
turbouser
2008-02-10 05:26
2008.03.23
Эй, админы...


3-1193746119
Dust
2007-10-30 15:08
2008.03.23
TADOQuery неопознанная ошибка


15-1202522610
Real
2008-02-09 05:03
2008.03.23
Уже три ночи