我正在尝试制作一种位图编辑器,所以我只想在位图上画一条线,而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);
但它不起作用。我正在尝试一些没有运气的想法:
TImage
与DisableInterpolation=true
甚至GlobalUseGPUCanvas=False
不起作用。TPaintBox
组件不符合我们的需求。Canvas.Quality=HighPerformance
,但它是一个只读属性。我尝试以不同的方式更改位图Canvas.Quality
但它不起作用。那么我怎样才能在Firemonkey中简单地绘制一条没有抗锯齿效果的线?
PS:我使用的是Delphi 10.2.3(东京)
FireMonkey在像素之间的网格上绘制线条,而不是像素。所以你必须在每个坐标上加0.5才能在像素上绘画:
Bmp.Canvas.DrawLine(PointF(5.5, 5.5), PointF(100.5, 100.5), 1);
这不会禁用抗锯齿,但会避免发生过多的抗锯齿现象。我不知道FireMonkey函数会禁用反alisiasing。您必须调用本机OS函数,例如MacOS上的CGContextSetAllowsAntialiasing
,但通常在您弄清楚如何在像素上绘制时就不再需要它了。
最后我找到了一种方法来做到这一点。这很简单,我想知道解决方案中是否存在一些隐藏的毒药(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
)。
我希望这可以帮助许多其他人解决同样的问题。