netcore 图形处理跨平台组件
现有的图形插件System.Drawing.Common NuGet 包现在被归为 Windows 特定的库。 在为非 Windows 操作系统编译时,平台分析器会在编译时发出警告。在跨平台linux部署时需要额外在dockerfile文件中添加相关命令用于安装libgdipus组件。它大约有 30000 行 C 代码,大部分未经测试,而且缺少很多功能。 libgdiplus
还具有许多用于图像处理和文本呈现的外部依赖项,例如 cairo
、pango
和其他本机库。 这些依赖项使得维护和交付组件更具挑战性。官方建议使用跨平台程式库如:ImageSharp、SkiaSharp。
下面分享一下本人用ImageSharp改造的相关生成条形码、二维码的方法(使用nuget包ZXing.Net.Bindings.ImageSharp.V2)。
using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp; using ZXing; using ZXing.Common; using ZXing.QrCode; using System.IO; using ZXing.ImageSharp.Rendering; namespace CLibrary_Standard2._1 { /// <summary> /// 条形/二维码处理 /// </summary> public static class BarCodeExtensions { /// <summary> /// 生成二维码 /// </summary> /// <param name="link"></param> /// <param name="color">Black、Red等</param> /// <param name="width">二维码宽,默认500</param> /// <param name="height">二维码高,默认500</param> /// <returns></returns> public static Stream GetDimensionalCode(string link, string color = "Black", int width = 500, int height = 500) { var w = new QRCodeWriter(); BitMatrix b = w.encode(link, BarcodeFormat.QR_CODE, width, height); var zzb = new ZXing.ImageSharp.BarcodeWriter<Rgba32>(); zzb.Options = new EncodingOptions() { Margin = 0, }; #region 设置颜色 Color fore_color; if (!Color.TryParse(color, out fore_color))//没有的话默认黑色 { fore_color = Color.Black; } zzb.Renderer = new ImageSharpRenderer<Rgba32>() { Foreground = fore_color, Background = Color.White }; #endregion var ms = new MemoryStream(); using (var image = zzb.Write(b)) { image.SaveAsJpeg(ms);//保存于流 image.SaveAsJpeg("QRCode_code.jpg");//直接保存相关路径 } ms.Position = 0;//设置位置 return ms; } /// <summary> /// 根据链接创建条形码 /// </summary> /// <param name="link">链接</param> /// <returns>返回条形码图片二进制串</returns> public static Stream GetStripCode(string link) { var width = 800; var height = 400; var margin = 0; var barcodeWriter = new ZXing.ImageSharp.BarcodeWriter<Rgba32> { Format = BarcodeFormat.CODE_128, Options = new EncodingOptions { Height = height, Width = width, PureBarcode = true, Margin = margin } }; var ms = new MemoryStream(); using (var image = barcodeWriter.Write(link)) { image.SaveAsJpeg(ms);//保存于流 image.SaveAsJpeg("TXM_code.jpg");//直接保存相关路径 } ms.Position = 0;//设置位置 return ms; } } }