gpt4 book ai didi

delphi - 使用 AlphaBlend 时如何定义颜色?

转载 作者:行者123 更新时间:2023-12-02 04:55:15 24 4
gpt4 key购买 nike

我有一个绘制在油漆盒上的图像,我希望能够在油漆盒的任何给定区域上方显示一个半透明的填充矩形,它将以较暗的颜色显示下面的油漆盒 Canvas ,有点像选择框来自 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 混合矩形选择自定义颜色?

最佳答案

目前您使用的是白色,您认为它是灰色的原因是半透明性。您可以通过传递 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,
...

关于delphi - 使用 AlphaBlend 时如何定义颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37286003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com