应设置TextRenderingHint为ClearTypeGridFit、SmoothingMode为AntiAlias,使用整数坐标,选用含中文的字体如“Microsoft YaHei”,并用StringFormat控制对齐与换行。

DrawString 绘制文字时字体模糊、锯齿明显怎么办
默认用 Graphics.DrawString 直接画文字,尤其在非整数坐标或缩放后,很容易发虚、边缘毛糙。这不是 bug,而是 GDI+ 默认启用了抗锯齿但没配对渲染模式。
- 必须在绘制前设置
graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit(仅 Windows 有效)或AntiAliasGridFit - 确保
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias,否则曲线字体(如微软雅黑)的弧线仍会生硬 - 避免把文字画在
Bitmap的非整数像素位置——比如new PointF(10.5f, 20.3f),小数坐标的 sub-pixel 渲染会加剧模糊;尽量用整数Point或四舍五入到最近像素
中文乱码或显示方块:字体没嵌入或不支持 GB2312/UTF-8
DrawString 不解析编码,它只依赖系统是否装了对应字形。你在代码里写 "你好",运行时却出□,大概率是字体本身不含中文 glyph。
- 别用
new Font("Arial", 12)画中文——Arial 默认无中文字体数据;改用"Microsoft YaHei"、"SimSun"或"Noto Sans CJK SC"(需提前安装) - 检查字体是否存在:
System.Drawing.FontFamily.Families列出所有可用族名,注意大小写和空格(如"Microsoft YaHei"≠"microsoft yahei") - 如果部署到 Server Core 或 Linux(通过 .NET 6+ 的
System.Drawing.Common),中文支持更脆弱:Linux 需手动安装fonts-wqy-zenhei等包,并设FONTCONFIG_PATH
DrawString 文字位置偏移、截断或换行失效
DrawString 的矩形区域(RectangleF)不是“锚点”,而是内容布局边界。它受 StringFormat 控制对齐与换行逻辑,不是简单左上角贴图。
- 文字垂直居中?不能只靠 y 坐标加减,要用
StringFormat搭配LineAlignment = StringAlignment.Center和Alignment = StringAlignment.Center - 想让长文本自动换行并限制宽度?传入的
RectangleF宽度必须明确,且stringFormat.FormatFlags |= StringFormatFlags.FitBlackBox可减少裁剪风险 - 测量实际占用尺寸:用
graphics.MeasureString(text, font, width, stringFormat)替代手算高度,尤其有行间距、下划线或不同字号混排时
Graphics.FromImage 创建的位图文字变色、透明度异常
从 32 位带 Alpha 的 Bitmap 创建 Graphics 对象后,DrawString 的颜色可能被背景混合,尤其是用 Color.FromArgb(255, 0, 0, 0) 画黑字却显灰。
- 确认位图像素格式:优先用
PixelFormat.Format32bppPArgb(预乘 Alpha),而不是Format32bppArgb;后者在 GDI+ 中对文字渲染支持不稳定 - 绘图前清空背景:
graphics.Clear(Color.White)(纯白底)或graphics.Clear(Color.Transparent)(透明底需确保 PNG 保存支持 Alpha) - 避免在
Graphics上反复创建/释放——每次FromImage都有开销,且未Dispose()易导致 GDI 句柄泄漏,文字渲染突然失败
实际用的时候,最常卡住的是字体存在性判断和像素对齐——这两处没验证,后面调再多样式也没用。











