You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:04:59