.NET Core 項目Linux環境下生成二維碼


問題:

公司系統開發中,需要對企微授權鏈接進行二維碼生成,然后向客戶提供;當然,首當其沖想到的是使用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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM