Форум: "Начинающим";
Текущий архив: 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