FMX的DrawLine()函数绘制1像素线条模糊?C++Builder 11求助
C++Builder 11 FMX绘制1像素清晰线条的解决方法
问题描述
在Windows 10上使用C++Builder 11社区版,VCL环境下绘制1像素宽线条清晰正常,但切换到FMX后,即使设置Stroke->Thickness = 1.0,绘制出的线条依然模糊,无法满足柱状图开发对1像素清晰线条的需求。
VCL实现代码
void __fastcall TForm1::Button1Click(TObject *Sender) { Canvas->Pen->Width = 1; Canvas->Pen->Color = (Graphics::TColor) clBlack; Canvas->MoveTo(100,100); Canvas->LineTo(500,100); Canvas->MoveTo(100,101); Canvas->LineTo(300,101); Canvas->MoveTo(100,102); Canvas->LineTo(500,102); }
VCL线条效果:线条锐利清晰,严格为1像素宽度,无模糊边缘。
FMX原实现代码
void __fastcall TForm1::Button1Click(TObject *Sender) { Canvas->BeginScene(); // Canvas->Clear(TAlphaColorRec::Blue); Canvas->Stroke->Color = TAlphaColorRec::Black; Canvas->Stroke->Thickness = 1.0; Canvas->DrawLine(TPointF(100,100), TPointF(500,100), 1.0); Canvas->DrawLine(TPointF(100,101), TPointF(300,101), 1.0); Canvas->DrawLine(TPointF(100,102), TPointF(500,102), 1.0); Canvas->EndScene(); }
FMX线条效果:线条边缘虚化模糊,视觉上宽于1像素,不符合需求。
已尝试调整透明度、线条厚度,重复绘制10次虽有改善,但并非合理解决方案。
解决方法
1. 对齐像素边界(核心解决)
FMX使用浮点坐标系统,当线条坐标为整数时,实际会绘制在像素的中间位置,触发GPU亚像素抗锯齿导致模糊。只需将坐标偏移0.5,让线条对齐到像素的边缘即可:
修改后的FMX代码:
void __fastcall TForm1::Button1Click(TObject *Sender) { Canvas->BeginScene(); Canvas->Stroke->Color = TAlphaColorRec::Black; Canvas->Stroke->Thickness = 1.0; // 偏移0.5使线条对齐像素边缘 Canvas->DrawLine(TPointF(100, 100.5), TPointF(500, 100.5), 1.0); Canvas->DrawLine(TPointF(100, 101.5), TPointF(300, 101.5), 1.0); Canvas->DrawLine(TPointF(100, 102.5), TPointF(500, 102.5), 1.0); Canvas->EndScene(); }
2. 关闭抗锯齿(可选补充)
若对齐坐标后仍有轻微模糊,可关闭画布或笔触的抗锯齿:
// 关闭整个画布的抗锯齿 Canvas->Quality = TCanvasQuality::Low; // 或仅针对当前笔触关闭抗锯齿 Canvas->Stroke->Quality = TStrokeQuality::Low;
3. 修正窗体缩放设置
若存在DPI缩放导致的线条拉伸,可关闭窗体自动缩放并固定缩放因子:
// 在窗体初始化时设置 Form1->AutoScale = false; Form1->ScaleFactor = 1.0;
原因说明
VCL基于GDI绘制,默认使用整数坐标并对齐像素边界,因此线条清晰;而FMX作为跨平台框架,默认采用浮点物理坐标,当线条位置落在像素中间时,GPU会进行亚像素采样(抗锯齿处理),导致线条视觉上模糊。
内容的提问来源于stack exchange,提问作者Clint
相关产品推荐
相关产品推荐

