如何在使用AlphaBlend时定义颜色?

时间:2016-05-17 20:49:32

标签: delphi lazarus

我有一个绘制在绘图箱上的图像,我希望能够在绘图框的任何给定区域上方显示半透明的填充矩形,它将以更深的颜色显示底部的绘图板画布,有点像选择框来自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混合矩形选择自定义颜色?

1 个答案:

答案 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,
      ...