Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.04.04;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
2-1264974740
Student :)
2010-02-01 00:52
2010.04.04
GSM модем TCommPortDriver


3-1234166667
keymaster
2009-02-09 11:04
2010.04.04
Работа с древовидными данными в FB


15-1263485382
toto
2010-01-14 19:09
2010.04.04
логин Windows


2-1265185700
Darvin
2010-02-03 11:28
2010.04.04
Работа с иконкой своего приложения в трее


15-1263485249
имя
2010-01-14 19:07
2010.04.04
Юридическая констатация всем давно известного факта