【发布时间】:2022-09-28 09:36:05
【问题描述】:
我正在尝试使用下一个制作圆形图像:
var
bmp: TBitmap;
Rgn: HRGN;
R: TRect;
...
R := Image1.ClientRect;
bmp := TBitmap.Create;
bmp.Assign(Graph);
bmp.Canvas.StretchDraw(Image1.ClientRect, Image1.Picture.Graphic);
Rgn := CreateRoundRectRgn(0, 0, Image1.Width, Image1.Height, Image1.Width, Image1.Height);
Image1.Picture.Assign(nil);
Image1.AutoSize := false;
Image1.Stretch := false;
Image1.Height := R.Bottom - R.Top;
Image1.Width := R.Right - R.Left;
Image1.Canvas.Brush.Color := clRed;
Image1.Canvas.FillRect(Image1.ClientRect);
SelectClipRgn(Image1.Canvas.Handle, Rgn);
Image1.Canvas.Draw(0, 0, bmp);
DeleteObject(rgn);
Image1.Canvas.Brush.Style := bsClear;
Image1.Picture.Bitmap.TransparentColor := clRed;
Image1.Picture.Bitmap.Transparent := True;
Image1.Transparent := True;
bmp.Free;
但结果并不令人满意,因为边缘出现锯齿状且不平滑。
怎样才能使这些边缘光滑?
-
您正在寻找的是抗锯齿,但使用区域裁剪绘图不支持该功能。
-
我找到了一种方法来通过使用 TGP Graphics 和 SmoothingMode AntiAlias 作为 SmoothingMode 在剪辑区域周围绘制弧线来实现结果。但不确定这是正确的方法。
-
“最佳”或“正确”方式完全取决于您的上下文。但一般来说,如果您想在 VCL 应用程序中制作漂亮的现代图形,您应该放弃 GDI(和 GDI+),转而使用 Direct2D。例如,我使用 Direct2D in this answer 正是因为我无法忍受 GDI 制作的非 AA 圆圈。