Форум: "Начинающим";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c