前言 在.NET 6之前我们一直是使用QRCoder来生成二维码(QRCoder是一个非常强大的生成二维码的组件,用到了System.Drawing.Common 包),然后从.NET 6开始,当为非 The type initializer for 'Gdip' threw an exception. ---- System.PlatformNotSupportedException : System.Drawing.Common libgdiplus 是本机端 System.Drawing.Common 跨平台实现的主要提供程序。 libgdiplus 实际上是对 System.Drawing.Common 所依赖的 Windows 部分的重新实现。该实现使 libgdiplus 成为一个重要的组件。 而 System.Drawing.Common 将主要继续在 Windows 窗体和 GDI+ 的上下文中进行演化。
而在 UOS 下,因为 GDI+ 是跨平台的,可以使用跨平台的 System.Drawing.Common 库进行转换 在哪里可以找到很多 EMF 或 WMF 格式的图片? 就是 dotnet C# 图片等比限制最大和最小大小缩放算法 所使用的方法 就是通过这么简单的逻辑就能实现,上面代码能在 Linux 和 Windows 使用 在使用之前需要使用 NuGet 安装 System.Drawing.Common 库,如果是 SDK 的 csproj 可以添加下面代码安装 <ItemGroup> <PackageReference Include="<em>System.Drawing.Common</em> " Version="4.7.0" /> </ItemGroup> 而除了 System.Drawing.Common 库之外,其他的库的支持也是很差,如非常有名的 SixLabors.ImageSharp 上面输出的 no created object, slot empty 就是核心,在 System.Drawing.Common 库的核心是调用 LibGdiPlus 库,这是放在 mono 组织下的一个库
System.Drawing.Common 补充: .NET Core 图像处理 Image 依赖于 System.Drawing.Common 包 看上方绿线 关于 System.Drawing.Common 包 的一些问题 参考: Linux/Docker 中使用 System.Drawing.Common 踩坑小计 - AT_HUAZI - 博客园 中断性变更:仅在 Windows 上支持 System.Drawing.Common libgdiplus 是本机端 System.Drawing.Common 跨平台实现的主要提供程序。 通过对 NuGet 包的分析,我们观察到 System.Drawing.Common 主要用于跨平台的图像处理,例如 QR 代码生成器和文本呈现。 System.Drawing.Common 将仅在 Windows 窗体和 GDI+ 的上下文中继续演变。
后来微软官方提供了一个组件 System.Drawing.Common实现了 System.Drawing 的常用类型,以 Nuget 包的方式发布的。今天就围绕它来讲一讲这里面的坑。 在 .NET Core 中可以通过安装 System.Drawing.Common 来使用 Image、Bitmap 等类型。 三.埋坑 System.Drawing.Common 组件提供对GDI+图形功能的访问。它是依赖于GDI+的,那么在Linux上它如何使用GDI+,因为Linux上是没有GDI+的。 进而可以推测 System.Drawing.Common 这个组件实现时,对于非Windows系统肯定依赖了 ligdiplus 这个组件。 就比如你要是用 Image、Bitmap 类型,你就得安装 System.Drawing.Common ;或者你用的组件依赖了 System.Drawing.Common,比如 QRCoder。
error_log PM> Install-Package QRCoder -Version 1.3.3 Install-Package : “QRCoder”已拥有为“System.Drawing.Common
这些类型在System.Drawing.Common NuGet包中,并包括 System.Drawing.Bitmap 和 System.Drawing.Font 。 在 .NET 5 和早期版本中,System.Drawing.Common NuGet 包适用于 Windows、Linux 和 macOS。 但是,存在一些平台差异。 若要在 Linux 和 macOS 上使用 System.Drawing.Common 包中的类型,必须单独安装 libgdiplus。 在 .NET 6 及更高版本中,System.Drawing.Common NuGet 包仅在 Windows操作系统上受支持。 有关详细信息,请参阅 仅支持System.Drawing.Common Windows。
而这个库就是 System.Drawing.Common(仓库在 这里)。 还是使用 System.Drawing.Common 库了吗? 盲猜应该使用 System.Drawing.Common 库吧? 所有种类的项目都能正常使用 System.Drawing.Common 库吗? 例如 Unity3D 项目 首先来看看问题一。 决定 现在,是时候来决定应该使用 System.Drawing.dll 还是使用 System.Drawing.Common 包了。
对于 .NET Core: System.Drawing.Common Lsj.Util.Win32 对于 .NET Framework / Mono: System.Drawing.dll Lsj.Util.Win32 如果你不打算引用 System.Drawing.Common,那么可以考虑使用裸的 GDI+ 来完成,可以参考 Win32/C# 应用不依赖任何库使用纯 GDI+ 对窗口截图(BitBlt) - walterlv
对于.NET Core 项目,必须引用 System.Drawing.Common NuGet 包。 在 Visual Studio 中,使用 NuGet 包管理器安装该包。 或者,也可以在 *.csproj 或 *.vbproj 文件中添加对包的引用: XML复制 <ItemGroup> <PackageReference Include="<em>System.Drawing.Common</em>
SeleniumHelper.SeleniumScreenshot(url, "mycsdn.png"); 三、HtmlToImage 1、安装库文件 和[PuppeteerSharp]一样安装下方库文件 Select.HtmlToPdf.NetCore System.Drawing.Common
CPU(可用 FIRC/bin/x64/Debug/CPUCheck.exe 检查) 依赖组件 OpenCvSharp 4.9.0 PaddleOCRSDK 3.0.0 Newtonsoft.Json System.Drawing.Common
由于System.Drawing.Common不再跨平台支持,因此我们移除了对它的依赖,换成了SixLabors.ImageSharp。
rawBytes = pageReader.GetImage(); 跨平台说明 Docnet 支持在以下平台上运行: • Windows (x64/x86) • Linux • macOS 但图像渲染示例依赖 System.Drawing.Common
我们有个手机的验证码发送逻辑需要使用验证码,这块本来项目里面就有验证码绘制逻辑,.Net Framework的,使用的包是System.Drawing,我把这验证码绘制逻辑复制到.Net Core的新项目引用对比包System.Drawing.Common
但是如果你想运行在Linux上可能需要注意一下: 由于NPOI使用System.Drawing.Common,因此必须在Linux系统上安装libgdiplus和libc6。
我们需要引用一个微软官方的NuGet包来引入我们在.NET Framework中曾经熟悉的那些API: Install-Package System.Drawing.Common -Version 4.5.1
Microsoft.ML.OnnxRuntime.Managed (1.20.1) OpenCvSharp4 (4.9.0.20240103) OpenCvSharp4.Extensions (4.9.0.20240103) System.Drawing.Common
原因是可执行项目输出的配置文件内容如下 "System.Drawing.Common/4.7.0": { "dependencies": {
额外的,我写过另一个通过此方式获得新旧框架兼容的包: 杂谈 System.Drawing.Common 的跨平台性 - walterlv 参考资料 What do mean . files in nuget
Imaging library Recommendation NuGet dependencies Extension file System.Drawing For Windows only projects System.Drawing.Common