【问题标题】:Soft edges Circular image软边缘圆形图像
【发布时间】: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 圆圈。

标签: image delphi gdi+


【解决方案1】:

我找到了这种处理问题的方法,希望它能帮助其他人:

var
GPGraph: TGPGraphics;
GPen: TGPPen;
GRect: TGPRect;
...

GRect := MakeRect(0, 0, Image1.Width-2, image1.Height-2);
              GPGraph := TGPGraphics.Create(image1.Canvas.Handle);
              GPGraph.SetSmoothingMode(SmoothingModeAntiAlias);

              GPen := TGPPen.Create(aclWhite, 2);
              GPen.SetStartCap(LineCapRound);
              GPen.SetEndCap(LineCapRound);
              GPGraph.DrawArc(GPen, 0, 0, Image1.Width-2, image1.Height-2, 0, 360)  ;
              GPen.Free;
              GPGraph.Free;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2021-08-31
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多