Главная страница
    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-1202820631
Ega23
2008-02-12 15:50
2008.03.23
Коллеги, нужна помощь в тестировании программы.


3-1193576969
alexche
2007-10-28 16:09
2008.03.23
Проблемы с ADO Connection


15-1202565066
vrem_
2008-02-09 16:51
2008.03.23
Фото участников форума, самые новые


11-1186122972
Alexey_k
2007-08-03 10:36
2008.03.23
Access Violation на компоненте MHIPEdit


2-1203861728
batya-x
2008-02-24 17:02
2008.03.23
мерцание на Timage





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