使用 AlphaBlend 时如何定义颜色?

How do I define a color when using AlphaBlend?

我有一张画在颜料盒上的图像,我希望能够在颜料盒的任何给定区域上方显示一个半透明的填充矩形,这将以较深的颜色显示下面的颜料盒 canvas,有点像 Windows Explorer.

中的选择框

经过反复试验(和一些阅读),我设法做到了以下几点:

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 混合矩形选择自定义颜色?

目前您使用的是白色,您认为它是灰色的原因是半透明。您可以通过将 255 作为 'AOpacity' 传递来验证它,您将看到一个白色矩形。

色调为白色,因为这是您的临时位图的颜色。您需要做的就是使用彩色位图。您应该删除 BitBlt 调用,当透明地复制到目标 canvas.

时,纯色位图足以应用着色颜色
  ...
  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,
      ...