我想用純粹的Windows GDI
(所以沒有GDI +,DirectX或類似的,沒有OpenGL,沒有彙編程序或第三方庫)混色(通過指定的alpha值着色)畫布的區域。
如何使用純GDI進行顏色混合(通過指定的alpha值進行着色)畫布區域?
我創建了下面的函數,我想知道是否有這樣做的更有效或更簡單的方法:
procedure ColorBlend(const ACanvas: HDC; const ARect: TRect;
const ABlendColor: TColor; const ABlendValue: Integer);
var
DC: HDC;
Brush: HBRUSH;
Bitmap: HBITMAP;
BlendFunction: TBlendFunction;
begin
DC := CreateCompatibleDC(ACanvas);
Bitmap := CreateCompatibleBitmap(ACanvas, ARect.Right - ARect.Left,
ARect.Bottom - ARect.Top);
Brush := CreateSolidBrush(ColorToRGB(ABlendColor));
try
SelectObject(DC, Bitmap);
Windows.FillRect(DC, Rect(0, 0, ARect.Right - ARect.Left,
ARect.Bottom - ARect.Top), Brush);
BlendFunction.BlendOp := AC_SRC_OVER;
BlendFunction.BlendFlags := 0;
BlendFunction.AlphaFormat := 0;
BlendFunction.SourceConstantAlpha := ABlendValue;
Windows.AlphaBlend(ACanvas, ARect.Left, ARect.Top,
ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, DC, 0, 0,
ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, BlendFunction);
finally
DeleteObject(Brush);
DeleteObject(Bitmap);
DeleteDC(DC);
end;
end;
爲了什麼這個功能應該也看到了這一概念以下的(鑑別:-)圖像:
這可以呈現this image
在方式的形式的頂部左側上面所示的代碼:
uses
PNGImage;
procedure TForm1.Button1Click(Sender: TObject);
var
Image: TPNGImage;
begin
Image := TPNGImage.Create;
try
Image.LoadFromFile('d:\6G3Eg.png');
ColorBlend(Image.Canvas.Handle, Image.Canvas.ClipRect, $0000FF80, 175);
Canvas.Draw(0, 0, Image);
finally
Image.Free;
end;
end;
有沒有更高效的方法來使用純GDI或Delphi VCL來做到這一點?
爲什麼你認爲你已經擁有的是不是有效? –
這就是我問的原因。我知道這是有效的,但我想要更多(如果可能的話:-) – TLama
你想從中得到什麼? –