Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];

Вниз

AlphaBlend без TransparentColor.   Найти похожие ветки 

 
Б   (2010-01-29 08:20) [0]

Здрасти!

Вывожу растр с альфой так.
Вопрос в том, как отсечь смешивание Transparent-цвета?
Чтобы сама картинка блендилась, а цветовой ключ отсекался.


Function XBlender(x, y: integer; B: TBitmap; A: byte): boolean;
Var
 Info: TBlendFunction;
begin
 ZeroMemory(@Info, SizeOf(Info));
 Info.SourceConstantAlpha:= A;

 // Device - TBitmap - DoubleBuffer;
 Result:= AlphaBlend(Device.Canvas.Handle, x, y, B.Width, B.Height, B.Canvas.Handle, 0, 0, B.Width, B.Height, Info);
End;


 
antonn ©   (2010-01-29 09:39) [1]

Можно предварительно обработать Tbitmap - занулить альфу там, где цветовой ключ.


 
Б   (2010-01-29 10:12) [2]

Так что ли?


Procedure TDisplay.Draw(const x, y: integer; B: TBitmap; A: byte);
Type
 PRGBQuadArray = ^TRGBQuadArray;
 TRGBQuadArray =  array [0..0] of TRGBQuad;
Var
 i, j   : LongWord;
 Scan   : PRGBQuadArray;
 R, G, P: byte;

 Info   : TBlendFunction;
begin
 // B.PixelFormat:= pf32bit;

 R:= GetRValue(B.TransparentColor);
 G:= GetGValue(B.TransparentColor);
 P:= GetBValue(B.TransparentColor);

 For j:= 0 to B.Height - 1 do
 begin
   Scan:= B.ScanLine[j];
   For i:= 0 to B.Width - 1 do
     If ((Scan[i].rgbRed   = R)  and
         (Scan[i].rgbGreen = G)  and
         (Scan[i].rgbBlue  = P)) then Scan[i].rgbReserved:= 0;
         // ZeroMemory(@Scan[i], 4);

 end;

 ZeroMemory(@Info, SizeOf(Info));
 Info.SourceConstantAlpha:= A;

 AlphaBlend(FDevice.Canvas.Handle, x, y, B.Width, B.Height, B.Canvas.Handle, 0, 0, B.Width, B.Height, Info);
End;


 
Б   (2010-01-29 13:22) [3]

Или это как то по другому?


 
Вася   (2010-01-29 13:27) [4]

не знаю что делает

ZeroMemory(@Info, SizeOf(Info));
Info.SourceConstantAlpha:=A;


но вроде же так надо:

Info.BlendOp:=AC_SRC_OVER;
Info.BlendFlags:=0;
Info.AlphaFormat:=AC_SRC_ALPHA;
Info.SourceConstantAlpha:=A;


а PremultAlpha уже сделано?AlphaBlend без него не может...=\\


а вот откуда в полупрозрачном картинке Transparent?и для чего?))

так-то вроде у вас уже работает нормально(только я бы копию делал,чтоб оригинал не портился).


 
Б   (2010-01-29 14:17) [5]


> Вася   (29.01.10 13:27) [4]


;)


> не знаю что делает


BlendOp       = AC_SRC_OVER = 0 - One flag;
BlendFlags   =  0 - Reserved.
AlphaFormat = 0 - not AC_SRC_ALPHA;

Или одним махом:

ZeroMemory(@Info, SizeOf(Info));

. . . . .


 
Вася   (2010-01-29 14:49) [6]

хм,обнуляет значить...только что там значит not?AlphaFormat имеет тип byte.
и оно не ноль: AC_SRC_ALPHA = $01;

вот примерно такое напривыдумывал:


var Form1: TForm1; B: TBitmap;

...

procedure PremultAlphaTransparent(BMP: TBitmap; TransparentColor: TColor; DeleteAlpha: Boolean);
var i: Integer; q: PRGBQuad; Red, Green, Blue: byte;
begin
Red:=GetRValue(TransparentColor);
Green:=GetGValue(TransparentColor);
Blue:=GetBValue(TransparentColor);
q:=BMP.ScanLine[BMP.Height-1];
for i:=0 to BMP.Height*BMP.Width-1 do
     begin
     if (q.rgbRed=Red) and (q.rgbGreen=Green) and (q.rgbBlue=Blue) then
           q.rgbReserved:=0
     else
           if DeleteAlpha then
                 q.rgbReserved:=255;
     q.rgbBlue:=q.rgbBlue*q.rgbReserved Shr 8;
     q.rgbGreen:=q.rgbGreen*q.rgbReserved Shr 8;
     q.rgbRed:=q.rgbRed*q.rgbReserved Shr 8;
     Inc(q);
     end;
end;

function XBlender_New(Dest: HDC; x, y: Integer; Source: TBitmap; A: byte): boolean;
var Info: TBlendFunction; temp: TBitmap;
begin
temp:=TBitmap.Create;
temp.Width:=Source.Width;
temp.Height:=Source.Height;
temp.Assign(Source);
temp.PixelFormat:=pf32bit;
if (Source.PixelFormat=pf32bit) then
     PremultAlphaTransparent(temp, Source.TransparentColor, false)
else
     PremultAlphaTransparent(temp, Source.TransparentColor, true);
Info.BlendOp:=AC_SRC_OVER;
Info.BlendFlags:=0;
Info.SourceConstantAlpha:=A;
Info.AlphaFormat:=AC_SRC_ALPHA; // = $01; // (!)
AlphaBlend(Dest, x, y, temp.Width, temp.Height, temp.Canvas.Handle, 0, 0, temp.Width, temp.Height, Info);
temp.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Color:=clGreen;
Form1.DoubleBuffered:=true;
TrackBar1.Max:=255;
// TrackBar1.Position:=255;
B:=TBitmap.Create;
B.LoadFromFile("C:\ttest.bmp"); // B.LoadFromFile("C:\SnowFlake.bmp");
B.TransparentColor:=B.Canvas.Pixels[0, 0]; // B.TransparentColor:=RGB(255, 0, 255);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
repaint;
XBlender_New(Form1.Canvas.Handle, 10, 10, B, TrackBar1.Position);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
B.Free;
end;


 
Б   (2010-01-29 14:59) [7]


> только что там значит not


Ты не правильно понял. Написано, что не используется флаг  AC_SRC_ALPHA,
но он оказывается работает только при BPP = 32.

P.S. Уже сам разобрался.


 
Вася   (2010-01-29 15:09) [8]

ну конечно...а как же "отсечь смешивание Transparent-цвета" если картинка не 32битная?=)
поэтому я и переводил временную картинку в 32битную перед отрисовкой:

temp.PixelFormat:=pf32bit;


 
Б   (2010-01-29 15:17) [9]


> ну конечно...а как же "отсечь смешивание Transparent-цвета"
> если картинка не 32битная?=)


До этого битность была равна 24-м, следовательно AC_SRC_ALPHA не работал.
Да кто ж знал, что надо предварительно делать PremultAlpha.


 
Вася   (2010-01-30 12:48) [10]

ну так мой вариант нормально подошел?он получился универсальным,и ошибок вроде нету...



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

Форум: "Начинающим";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
6-1216320126
alexda
2008-07-17 22:42
2010.04.04
Socket Error


15-1263479212
Piter
2010-01-14 17:26
2010.04.04
HTML "base href" и JavaScript в IE


15-1263435454
brother
2010-01-14 05:17
2010.04.04
Уникальность окна


2-1265023414
И. Павел
2010-02-01 14:23
2010.04.04
Как поменять столбцы местами?


3-1237814635
JanMihail
2009-03-23 16:23
2010.04.04
TFieldType





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