Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1202580316
В,алекс
2008-02-09 21:05
2008.03.23
Виста / D7


2-1203784386
Chris-81
2008-02-23 19:33
2008.03.23
Forward


2-1204081876
Stepper
2008-02-27 06:11
2008.03.23
Как сохранить/считать значение TMemuItem?


2-1204115691
Иван Владимирович
2008-02-27 15:34
2008.03.23
MSSqlServer 2000


2-1203619274
Антон
2008-02-21 21:41
2008.03.23
выгрузка dll из пямяти





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский