在Canvas上绘制,在Firemonkey中没有抗锯齿效果

问题描述 投票:0回答:2

我正在尝试制作一种位图编辑器,所以我只想在位图上画一条线,而Firemonkey中没有抗锯齿效果。像这样的东西:

var
  Bmp: TBitmap;

Bmp := TBitmap.Create(2000, 2000);
if (Bmp.Canvas.BeginScene) then 
begin
  Bmp.Canvas.Stroke.Color := TAlphaColors.Aquamarine;
  Bmp.Canvas.DrawLine(PointF(5, 5), PointF(100, 100), 1);
  Bmp.Canvas.EndScene;
  Bmp.SaveToFile('c:\temp\result.bmp');
end;
FreeAndNil(Bmp);

但它不起作用。我正在尝试一些没有运气的想法:

  • 根据我的同事的说法,使用Map / Unmap直接访问位图数据的速度非常慢,位图很大。
  • 使用TImageDisableInterpolation=true甚至GlobalUseGPUCanvas=False不起作用。
  • 使用TPaintBox组件不符合我们的需求。
  • 解决方案是使用Canvas.Quality=HighPerformance,但它是一个只读属性。我尝试以不同的方式更改位图Canvas.Quality但它不起作用。

那么我怎样才能在Firemonkey中简单地绘制一条没有抗锯齿效果的线?

PS:我使用的是Delphi 10.2.3(东京)

delphi firemonkey
2个回答
1
投票

FireMonkey在像素之间的网格上绘制线条,而不是像素。所以你必须在每个坐标上加0.5才能在像素上绘画:

Bmp.Canvas.DrawLine(PointF(5.5, 5.5), PointF(100.5, 100.5), 1);

这不会禁用抗锯齿,但会避免发生过多的抗锯齿现象。我不知道FireMonkey函数会禁用反alisiasing。您必须调用本机OS函数,例如MacOS上的CGContextSetAllowsAntialiasing,但通常在您弄清楚如何在像素上绘制时就不再需要它了。


0
投票

最后我找到了一种方法来做到这一点。这很简单,我想知道解决方案中是否存在一些隐藏的毒药(LOL)。 TCanvasManager允许从给定的位图创建HighPerformance Canvas。根据我的测试,它没有抗锯齿。这里的代码:

var
  Bmp: TBitmap;
  TmpCanvas: TCanvas;
begin
  Bmp := TBitmap.Create(2000, 2000);
  TmpCanvas := TCanvasManager.CreateFromBitmap(Bmp, TCanvasQuality.HighPerformance);
  if (TmpCanvas.BeginScene) then
  begin
    TmpCanvas.Stroke.Color := TAlphaColors.Aquamarine;
    TmpCanvas.DrawLine(PointF(5, 5), PointF(100, 100), 1);
    TmpCanvas.EndScene;
    Bmp.SaveToFile('c:\temp\result.bmp');
  end;
  FreeAndNil(TmpCanvas);
  FreeAndNil(Bmp);

我还发现它不适用于在Canvas上编写文本的方法(Canvas.FillText)。

我希望这可以帮助许多其他人解决同样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.