做 .NET 后台开发的同学,大概率都踩过一个经典坑:本地 Windows 运行图片水印、裁剪、生成海报完全正常,一部署到 Linux 服务器、Docker 容器就直接报错崩溃。
报错信息很固定:System.PlatformNotSupportedException: System.Drawing.Common is not supported on non-Windows platforms。

之前网上很多旧教程、老项目都在用 System.Drawing.Common 做图片处理,但随着 .NET 6+ 普及,这个库已经彻底退出跨平台舞台。
本文结合近期项目迁移的实战经验,实事求是讲清楚:为什么它不跨平台、网上临时解法为什么不推荐、以及真正免费、稳定、生产可用的跨平台替换方案,附带真实迁移代码,杜绝空泛理论。
很多人只知道报错,但不清楚底层原因,总想着找个配置开关凑合用,最后生产环境翻车。
首先明确微软官方的核心定位(无歧义):
System.Drawing.Common 被正式定义为 Windows 专属库;根本原因很简单,不玩虚的:
System.Drawing 最早是 .NET Framework 的桌面图形库,所有绘图逻辑、图片解析、字体渲染,全部封装的是 Windows 原生 GDI+ API,压根不是为跨平台设计的。libgdiplus 兼容层。这层适配本身漏洞多、字体渲染错乱、性能差、部分图像处理逻辑不兼容,而且需要服务器额外安装依赖,部署极其麻烦。
搜这个报错,大概率会搜到一个解法:在 runtime 配置里开启 Unix 支持,很多人为了省事直接用,结果后续升级 .NET 版本直接炸库。
在 runtimeconfig.json 添加配置:
{
"runtimeOptions": {
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
}
⚠️ 重点提醒(真实踩坑):
libgdiplus,Docker 部署需要额外装系统依赖,环境不一致极易出问题。
结论:所有新项目、跨平台项目、Docker 部署项目,绝对不要用这个兼容方案。短期偷懒,长期必返工。
我筛选了目前社区最成熟、完全免费可商用、无版权风险、全平台兼容的两个核心库,摒弃小众玩具,只讲生产可用的,同时说清各自适用场景,避免盲目选型。
这是我目前所有新项目的默认选型,也是 .NET 社区公认的 System.Drawing 最佳平替。
核心优势:
许可证提醒(重要): ⚠️ ImageSharp 并非 Apache 2.0,而是采用 Six Labors Split License。免费使用需满足:
适用场景:90% 的后台图片处理需求(缩略图、图片压缩、文字/图片水印、格式互转),且符合免费使用条件。
安装 NuGet:
dotnet add package SixLabors.ImageSharp
dotnet add package SixLabors.ImageSharp.Drawing # 文字、图形绘制必备
实战代码(替换原生 Drawing 水印功能,跨平台字体处理):
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.Fonts;
using SixLabors.ImageSharp.Drawing.Processing;
// 加载图片,自动兼容所有系统
usingvar image = Image.Load("test.jpg");
// 准备跨平台字体(推荐打包免费字体,避免依赖系统字体)
var fontCollection = new FontCollection();
// 加载项目内置的免费可商用字体(例如思源黑体、阿里巴巴普惠体等)
var fontFamily = fontCollection.Add("fonts/NotoSansSC-Regular.ttf");
var font = fontFamily.CreateFont(20, FontStyle.Regular);
// 执行裁剪 + 文字水印
image.Mutate(opt =>
{
// 裁剪图片
opt.Crop(new Rectangle(50, 50, 500, 500));
// 绘制文字水印,位置、颜色可自行调整
opt.DrawText("项目水印 2026", font, Color.White, new PointF(15, 15));
});
// 保存结果
image.Save("output.jpg");
生产建议:永远不要在跨平台代码中硬编码“微软雅黑”等 Windows 专有字体,而应选用无版权纠纷的字体文件随项目打包,确保环境一致。

SkiaSharp 是 Google 开源的跨平台 2D 图形库,Chrome、安卓系统都在用这套渲染引擎,稳定性拉满。
核心优势:
SKTypeface 加载 *.ttf,跨平台一致性极好。适用场景:自定义报表图片、复杂海报合成、矢量图形绘制、批量图文渲染,以及对版权限制敏感的团队。
安装 NuGet:
dotnet add package SkiaSharp
dotnet add package SkiaSharp.NativeAssets.Linux # Docker/Linux 环境必备

为了方便大家快速决策,直接给落地选型标准,不用纠结:
System.Drawing.Common + 兼容开关(短期凑活,长期埋雷)。
很多人不敢迁移,是怕改动量大,这里给个轻量化迁移思路:
System.Drawing.Common 引用。Bitmap 替换为 Image(ImageSharp)或 SKBitmap(SkiaSharp),绘图逻辑用链式 Mutate 或 Canvas 绘制替换。这样可以做到 业务代码零改动,彻底解决跨平台报错。

很多 .NET 开发者习惯性依赖原生库,觉得官方库最稳,但 System.Drawing.Common 是典型的“时代遗留产物”。
在 .NET 全面跨平台、容器化部署的当下,依赖 Windows 专属 GDI+ 的老库必然被淘汰。与其每次部署踩坑、临时开兼容开关兜底,不如一次性彻底迁移到现代跨平台方案。ImageSharp 和 SkiaSharp 经过多年社区迭代,稳定性、性能、跨平台一致性早已全面超越老旧的 System.Drawing,迁移后不仅解决报错,还能规避很多原生库的隐性 bug。
总结
System.Drawing.Common 跨平台,.NET 7 无任何兼容退路;System.Drawing.Common。