Overview
在 GR32 库中,我使用 TImgView32 渲染网格,该网格将成为我的透明背景,如下所示:
放置在 TImgView32 内的我有一个常规的 TImage,我将在其中在画布上绘图,如下所示:
Task
我想要实现的是能够设置画笔的不透明度,从而为我的程序中的图像编辑提供更多可能性。设置画笔的不透明度允许不同级别的颜色深度等,而不是绘制一种单一颜色。
我早些时候在搜索时发现了这个问题:在Delphi 2010中绘制不透明度椭圆 https://stackoverflow.com/questions/4916913/draw-opacity-ellipse-in-delphi-2010/4917296#comment13314494_4917296- Andreas Rejbrand 在回答该问题时提供了一些示例。
我研究了安德烈亚斯所做的事情,并提出了我自己的简化尝试,但我遇到了一个问题。看看接下来的两张图片,第一张是透明背景,第二张是黑色背景,可以更清楚地显示问题:
正如你所看到的,画笔(圆圈)周围是一个非常烦人的正方形,我无法摆脱它。所有可见的都是画笔。这是我用来产生这些结果的代码:
procedure DrawOpacityBrush(ACanvasBitmap: TBitmap; X, Y: Integer;
AColor: TColor; ASize: Integer; Opacity: Integer);
var
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
try
Bmp.SetSize(ASize, ASize);
Bmp.Transparent := False;
with Bmp.Canvas do
begin
Pen.Color := AColor;
Pen.Style := psSolid;
Pen.Width := ASize;
MoveTo(ASize div 2, ASize div 2);
LineTo(ASize div 2, ASize div 2);
end;
ACanvasBitmap.Canvas.Draw(X, Y, Bmp, Opacity);
finally
Bmp.Free;
end;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
DrawOpacityBrush(Image1.Picture.Bitmap, X, Y, clRed, 50, 85);
end;
它在常规位图上生成:
我的想法(基于 Andreas 创建具有不透明度的椭圆的方法)是在画布上渲染典型的画笔,将其分配给屏幕外位图,然后将其重新绘制到具有不透明度的主位图上。除了边缘那个烦人的方块之外,这很有效。
如何渲染具有不透明度的画笔(如屏幕截图所示),但画笔圆周围没有那个正方形?
如果我设置Bmp.Transparent := True
仍然有一个白色框,但不再不透明。只是一个实心白色正方形和实心红色圆圈。