我试图制作一种位图编辑器,所以我只想在位图上画一条线,而在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(东京)
答案 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
)上书写文本的方法。
我希望这可以帮助许多其他人遇到相同的问题。