Главная страница
    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.009 c
2-1202308435
dusha
2008-02-06 17:33
2008.03.23
Динамическая вставка фрейма в форму?


2-1203922619
Настёна
2008-02-25 09:56
2008.03.23
ОС перезагружается!


15-1202823736
Kerk
2008-02-12 16:42
2008.03.23
Нюансы общения с заказчиками


2-1203867327
Рустам
2008-02-24 18:35
2008.03.23
работа в трее


2-1203489060
Максим
2008-02-20 09:31
2008.03.23
разбор строка





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