首页 > 系统相关 >.NET Core 项目Linux环境下生成二维码

.NET Core 项目Linux环境下生成二维码

时间:2022-11-17 17:11:48浏览次数:61  
标签:Core writer ZXing 二维码 Linux new NET 500 ImageSharp

问题:

公司系统开发中,需要对企微授权链接进行二维码生成,然后向客户提供;当然,首当其冲想到的是使用ZXing.NET库进行实现,毕竟生成简单二维码也就那几句代码;
然而,在本地环境中,一切都很正常,但是进入到开发环境中却出现了如下的异常:

System.TypeInitializationException: The type initializer for'Gdip' threw an exception.


代码:

/// <summary>
/// 生成二维码
/// </summary>
/// <param name="value">value</param>
/// <param name="width">二维码宽,默认500</param>
/// <param name="height">二维码高,默认500</param>
public static Bitmap ToQrCode(this string value, int width = 500, int height = 500)
{
    BarcodeWriter writer = new BarcodeWriter();
    writer.Format = BarcodeFormat.QR_CODE;
    QrCodeEncodingOptions options = new QrCodeEncodingOptions
    {
        DisableECI = true,
        CharacterSet = "UTF-8",
        Margin = 1,
        Width = width,
        Height = height
    };
    writer.Options = options;

    return writer.Write(value);
}

原因:

从异常信息中不难看出来,是 System.Drawing 接口抛出的异常;
经过冲浪发现,System.Drawing.Common被归为Windows特定的库,是对windows下绘图的一个简单封装,缺少跨平台的支持,这也就导致了我在本地环境(windows)下正常,但是去到了开发环境(Linux)却发生了异常;

解决:

1、在linux环境下安装libgdipplus包
libgdiplus 实际上是对 System.Drawing.Common 所依赖的 Windows 部分针对linux平台下的重新实现;

2、更换图像库
如使用如下库:

在我司,架构师说不推荐使用第一种方式,毕竟迁移项目或者增加节点时需要进行相应的服务器配置,这是相对比较麻烦的;
所以我们选择了第二种,且使用了SixLabors.ImageSharp进行了图片的处理;同时,生成二维码的库也换成了针对SixLabors.ImageSharp实现的ZXing.NET 版本的库;
对此需要安装如下包:

  • ZXing.Net.Bindings.ImageSharp.V2
  • SixLabors.ImageSharp

具体实现代码如下:

using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.PixelFormats;
using System.IO;
using ZXing;

/// <summary>
/// 生成二维码
/// </summary>
/// <param name="value">value</param>
/// <param name="width">二维码宽,默认500</param>
/// <param name="height">二维码高,默认500</param>
public static Bitmap ToQrCode(this string value, int width = 500, int height = 500)
{
    var writer = new ZXing.ImageSharp.BarcodeWriter<Rgba32>
    {
        Format = BarcodeFormat.QR_CODE,
        Options = new ZXing.QrCode.QrCodeEncodingOptions
        {
            DisableECI = true,
            CharacterSet = "UTF-8",
            Width = width,
            Margin = 1
        }
    };
    var image = writer.WriteAsImageSharp<Rgba32>(value);
    var ms = new MemoryStream();
    image.Save(ms, new PngEncoder());
    return ms;
}

标签:Core,writer,ZXing,二维码,Linux,new,NET,500,ImageSharp
From: https://www.cnblogs.com/webenh/p/16900075.html

相关文章

  • .NET Core 获取程序运行环境信息与反射的应用
    笔者的九篇反射系统文章已经完结,但是笔者会持续更新反射在日常撸码中的应用。本篇内容主要是.NETCore获取运行环境信息、利用反射更加方便地处理数据。本篇内容有:Runti......
  • linux基础
    Linux1.linux介绍1.1linux发行版介绍1.redhat红帽子系统,收费,全世界用的最多的系统2.centos,全世界用的第二多的服务端操作系统,和redhat用法一模一样,名字不一样而已,免......
  • Kubeadm搭建kubernetes集群
    Kubeadm搭建kubernetes集群环境说明|角色|ip|操作系统|组件||–|–|–||master|192.168.203.100|centos8|docker,kubectl,kubeadm,kubelet||node2......
  • linux权限管理
    linux权限系统创建了用户,同时会创建一个同名的组例如useraddcaixukun#创建普通用户caixukun,系统会在/etc/passwd文件中,增加一行用户信息且同时创建了一个用户组......
  • .net core 获取本地ip及request请求端口
    1.获取ip和端口stringstr=(Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString()+":"+Request.HttpContext.Connection.LocalPort); 输出s......
  • linux 常用知识
    linux是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到业界的认可,目前很多中型,大型甚至是巨型项目都在使用linux。linux内核:redhat、红旗linux、ubuntu、......
  • OS + Linux file type / linux ls
    slinux字符设备文件类型的标志Linux下的文件类型1.-开头表示普通文件2.d开头表示目录文件3.b开头表示块设备4.c开头表示是字符设备5.I开头表示符号链接文件6.p开头......
  • 基于centos7.9二进制部署kubernetes1.25.4
    基于centos7.9二进制部署kubernetes1.25.41、环境准备IP地址主机角色系统192.168.100.153k8s-master01K8S集群主节点Centos7.9192.168.100.154k8s-ma......
  • Linux中 CPU 引出网卡的 MAC 地址的设置
    CPU直接引出的网卡地址,不能用ethool操作,它不同于英特尔的网卡,英特尔的网卡可以直接把MAC地址烧录在网卡的物理内存,所以可以用ethtool操作。那CPU的网卡MAC地址如何固定......
  • 【Linux IO模型】IO模型 - epoll的原理与应用
    epoll原理与应用介绍epoll-I/Oeventnotificationfacility实现处理tcp请求,为一个连接对应一个线程,在高并发的场景,这种多线程模型于epoll相比就相形见绌了。epoll......