我有一个绘制在绘图箱上的图像,我希望能够在绘图框的任何给定区域上方显示半透明的填充矩形,它将以更深的颜色显示底部的绘图板画布,有点像选择框来自Windows资源管理器。
经过多次试验和错误(以及一些阅读),我设法做了以下事情:
procedure OpacityRectangle(ACanvas: TCanvas; ARect: TRect; AColor: TColor;
AOpacity: Integer);
var
BlendFunc: BLENDFUNCTION;
W, H: Integer;
Bitmap: TBitmap;
begin
W := ARect.Width;
H := ARect.Height;
BlendFunc.BlendOp := AC_SRC_OVER;
BlendFunc.BlendFlags := 0;
BlendFunc.SourceConstantAlpha := AOpacity;
BlendFunc.AlphaFormat := 0;
Bitmap := TBitmap.Create;
try
Bitmap.PixelFormat := pf32Bit;
Bitmap.SetSize(W, H);
BitBlt(Bitmap.Canvas.Handle, ARect.Left + W, ARect.Top + H, W, H,
ACanvas.Handle, 0, 0, SRCCOPY);
AlphaBlend(ACanvas.Handle, ARect.Left, ARect.Top,
W, H, Bitmap.Canvas.Handle, 0, 0, W, H, BlendFunc);
finally
Bitmap.Free;
end;
end;
正如您所看到的,AColor
参数未被使用,因为我不确定如何在上面实现它。目前,alpha混合矩形的颜色是灰色阴影(我假设默认颜色),我需要知道如何更改alpha混合矩形的色调。
如何修改上述内容以允许为着色的alpha混合矩形选择自定义颜色?
答案 0 :(得分:8)
目前你正在使用白色,你认为它是灰色的原因是半透明的。你可以通过传递255作为“AOpacity'来验证它,你会看到一个白色的矩形。”
色调颜色为白色,因为它是临时位图的颜色。您需要做的就是使用彩色位图。您应该删除BitBlt
调用,纯色位图足以在将其透明地复制到目标画布时应用有色颜色。
...
try
Bitmap.PixelFormat := pf32Bit;
Bitmap.Canvas.Brush.Color := AColor; // <- set tint color
Bitmap.SetSize(W, H);
AlphaBlend(ACanvas.Handle, ARect.Left, ARect.Top,
...
<小时/> 在Lazarus的情况下,显式地绘制位图表面,fpc图形在放大位图时不支持画笔颜色(因此位图最初是黑色的)。
..
try
Bitmap.PixelFormat := pf32Bit;
Bitmap.SetSize(W, H);
Bitmap.Canvas.Brush.Color := AColor;
Bitmap.Canvas.FillRect(Bitmap.Canvas.ClipRect);
AlphaBlend(ACanvas.Handle, ARect.Left, ARect.Top,
...