在Firemonkey中在画布上绘制时没有抗锯齿效果

时间:2018-12-18 18:10:34

标签: delphi firemonkey

我试图制作一种位图编辑器,所以我只想在位图上画一条线,而在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(东京)

2 个答案:

答案 0 :(得分:1)

FireMonkey在像素之间而不是像素上绘制网格线。因此,您必须在每个坐标上加上0.5才能绘制像素:

dogs.js

这不会禁用抗锯齿,但是避免了否则会发生过多的抗锯齿。我不知道禁用反锯齿的FireMonkey函数。您可能必须调用本机OS函数,例如在MacOS上调用Bmp.Canvas.DrawLine(PointF(5.5, 5.5), PointF(100.5, 100.5), 1); ,但是通常在您知道如何在像素上绘画后就不再需要它。

答案 1 :(得分:0)

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

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)上书写文本的方法。

我希望这可以帮助许多其他人遇到相同的问题。