Delphi 德尔菲画一个平滑的饼

Delphi 德尔菲画一个平滑的饼,delphi,canvas,drawing,Delphi,Canvas,Drawing,在Delphi中,有人有在画布上绘制平滑饼图的代码吗 我在网上能找到的只是平滑线条的例子,但这对我帮助不大。。。 我也考虑过Gr32,但出于我的需要,它为我的应用程序增加了相当大的空间。 我只需要在画布上画一个填充的馅饼,看起来不像默认的那样糟糕 Canvas.Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4); 我使用Delphi XE,所以没有Firemonkey 编辑 左边的饼图是根据您的推荐@johan使用以下代码获得的: procedure TForm1.But

在Delphi中,有人有在画布上绘制平滑饼图的代码吗

我在网上能找到的只是平滑线条的例子,但这对我帮助不大。。。 我也考虑过Gr32,但出于我的需要,它为我的应用程序增加了相当大的空间。 我只需要在画布上画一个填充的馅饼,看起来不像默认的那样糟糕

Canvas.Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4);
我使用Delphi XE,所以没有Firemonkey

编辑

左边的饼图是根据您的推荐@johan使用以下代码获得的:

procedure TForm1.Button4Click(Sender: TObject);
var
    Center:TPoint;
    Radius:integer;
    Bmp: TBitmap;
    MF: TMetaFile;
    MetafileCanvas: TMetafileCanvas;
begin
  MF := TMetaFile.Create;
  MF.Width := 150;
  MF.Height := 150;

  MetafileCanvas := TMetafileCanvas.Create(MF, 0);
  MetafileCanvas.Pen.Color := clRed;
  MetafileCanvas.Brush.Color := clRed;
  MetafileCanvas.Brush.Style := bsSolid;
  MetafileCanvas.Pie(0,0,150, 150, 150,50, 150,50);

  MetafileCanvas.Free;

  Bmp := Gdip.DrawAntiAliased(MF);
  Image2.Picture.Assign(Bmp);
  Bmp.Free;
  MF.Free;
end;

感谢您使用synopse gdiplus库绘制抗锯齿图形,请参阅:

下面是一个例子:

implementation

uses 
  SynGDIPlus;  //provides gdip (see below)

procedure TForm1.FormResize(Sender: TObject);
var Bmp: TBitmap;
    MF: TMetaFile;
    MetafileCanvas: TMetafileCanvas;
begin
  MF := TMetaFile.Create;
  MF.Width := 300;
  MF.Height := 200;

  MetafileCanvas := TMetafileCanvas.Create(MF, 0);
  MetafileCanvas.Brush.Color := clRed;
  MetafileCanvas.Brush.Style := bsDiagCross;
  MetafileCanvas.Pie(0,0,50, 50, 300,50, 200,50);
  MetafileCanvas.Free;

  Bmp := Gdip.DrawAntiAliased(MF);
  Image1.Picture.Assign(Bmp);
  Bmp.Free;
  //Image1.Picture.Assign(MF);

  MF.Free;
end;
使用此单元,您只需拉入单个单元,仅此而已。
您不必使用图元文件,也可以直接绘制到DC,但SynGDIPlus在内部使用图元文件

更快的选择
如果性能是一个问题,那么Graphics32库将更快。


我认为你太担心图形的足迹了32

这可以通过GDI+轻松完成。该键使用的是
SmoothingModeAntiAlias

uses GDIPAPI, GDIPOBJ;

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
  b: TGPBrush;
  r: TGPRect;
begin
  r := MakeRect(10, 10, ClientWidth - 20, ClientHeight - 20);
  g := TGPGraphics.Create(Canvas.Handle);
  g.SetSmoothingMode(SmoothingModeAntiAlias);  
  b := TGPSolidBrush.Create(aclGreen);
  p := TGPPen.Create(aclRed, 1);
  g.FillPie(b, r, 45, 90);
  g.DrawPie(p, r, 45, 90);
  b.Free;
  p.Free;
  g.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Invalidate;
end;
用Delphi5测试


不幸的是,这不是我需要的。画布上画的饼是方形的。。。不顺利。我需要一个绘图功能,将有光滑的边缘。请查看我添加到问题中的图像,你称之为平滑,世界其他地方称之为抗锯齿。这正是我的答案。Net通过使用GDI+来实现这一点,同样,GDI+正是答案中的链接代码所提供的。好的,那么,为什么上面的图像显示的是用您的代码绘制的饼图,而不是反锯齿?看起来抗锯齿绘图是在绘制饼图之后完成的。。。我刚刚在你的代码中将画笔样式更改为实心,并更改了大小,饼图看起来像左边的那个(上图),而它应该看起来像右边的那个。关于图形32,除了封装外形,我的IDE有一个小问题,我似乎无法安装gr32包。我不知道它有什么问题,所以我在这里寻找替代品。在过去,我与graphics32合作得很好,我相信我可以用它很快解决我的问题。。。但话说回来。。。我应该能够安装它以便使用它:(