GDI+ 在 .NET 6+ 中已过时,System.Drawing.Common 跨平台不可靠,生产环境禁用于 Web;Graphics 报“对象已被释放”主因是未及时 Dispose() 或复用已销毁实例;文字模糊需设 TextRenderingHint;Linux/macOS 缺 libgdiplus 会崩溃,应改用 SkiaSharp 或 ImageSharp。

GDI+ 在 .NET 6+ 中已标记为过时,System.Drawing.Common 在非 Windows 平台行为不可靠,生产环境不建议用于 Web 或跨平台图形生成。
为什么 Graphics 对象一用就报“对象已被释放”
常见于在窗体控件的 Paint 事件外手动调用 Graphics.FromImage() 或 Graphics.FromHwnd() 后未及时 Dispose(),或试图复用已随 Bitmap 或窗体销毁的 Graphics 实例。
- 所有由
Graphics.FromXXX()创建的对象都必须显式Dispose(),不能依赖 GC - 在
Form.Paint事件中,e.Graphics是系统提供的临时实例,禁止Dispose(),也不应缓存 - 在
Bitmap上绘图时,必须确保Bitmap本身生命周期长于Graphics:先new Bitmap(),再Graphics.FromImage(),绘图完先graphics.Dispose(),再bitmap.Dispose()
DrawString 文字模糊、锯齿严重怎么办
默认渲染质量低,尤其在高 DPI 或缩放界面下。根本原因是 Graphics.TextRenderingHint 和 Graphics.SmoothingMode 未设置。
- 文字清晰度关键看
TextRenderingHint:优先设为TextRenderingHint.ClearTypeGridFit(Windows)或TextRenderingHint.AntiAliasGridFit(跨平台兼容性稍好) -
SmoothingMode影响线条/曲线,对文字无直接作用,但常被误调;设它不会让文字变锐利 - 务必在调用
DrawString()前设置:g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
- 若目标是图标或小字号文字(≤10pt),ClearType 可能反而发虚,此时改用
TextRenderingHint.SingleBitPerPixelGridFit
在 ASP.NET Core 中用 System.Drawing 生成图片会崩溃
Linux/macOS 容器中缺少 GDI+ 依赖(如 libgdiplus),抛出 DllNotFoundException: libgdiplus 或内部句柄为空异常,且 .NET 6+ 已明确不保证其跨平台稳定性。
- 不要在 Web API 或后台服务中使用
System.Drawing.Common生成图片——这是最易踩的生产陷阱 - 替代方案:用
SkiaSharp(推荐,跨平台、高性能、API 类似 GDI+)、ImageSharp(纯托管、无 native 依赖) - 若必须沿用旧代码,Windows Server 需安装
libgdiplus(Debian/Ubuntu:apt-get install libgdiplus),但仍有线程安全风险(System.Drawing内部部分操作非线程安全) -
dotnet publish时若提示 “runtimes/linux-x64/native/libgdiplus.so not found”,说明运行时缺失,不是打包问题
真正难的不是画一条线或写一行字,而是判断该不该用 GDI+ —— 它的生命周期管理反直觉,跨平台支持是幻觉,而替代库的迁移成本往往被低估。


















