ZXing QrCode 渲染器异常与 .Net Core 2.1

Posted

技术标签:

【中文标题】ZXing QrCode 渲染器异常与 .Net Core 2.1【英文标题】:ZXing QrCode renderer exception with .Net Core 2.1 【发布时间】:2019-03-08 07:34:22 【问题描述】:

我想用 ZXing(0.16.4) 创建一个二维码,但是我遇到了以下异常,

System.InvalidOperationException: '你必须设置一个渲染器 实例。'

几乎相同的代码适用于 .Net Framework 4.6.1

这是我的代码

static void Main(string[] args)

    var qrCode = CreateQrCode("test");
    Console.ReadKey();


public static byte[] CreateQrCode(string content)

    BarcodeWriter<Bitmap> writer = new BarcodeWriter<Bitmap>
    
        Format = BarcodeFormat.QR_CODE,
        Options = new QrCodeEncodingOptions
        
            Width = 100,
            Height = 100,
        
    ;

    var qrCodeImage = writer.Write(content); // BOOM!!

    using (var stream = new MemoryStream())
    
        qrCodeImage.Save(stream, ImageFormat.Png);
        return stream.ToArray();
    

【问题讨论】:

【参考方案1】:

我解决了这个问题,基本上我用https://www.nuget.org/packages/ZXing.Net.Bindings.CoreCompat.System.Drawing

我创建从以下命名空间生成的 BarcodeWriter

ZXing.CoreCompat.System.Drawing

这是我的 CreateQrCode 方法

public static byte[] CreateQrCode(string content)

    BarcodeWriter writer = new BarcodeWriter
    
        Format = BarcodeFormat.QR_CODE,
        Options = new QrCodeEncodingOptions
        
            Width = 100,
            Height = 100,
        
    ;

    var qrCodeImage = writer.Write(content); // BOOM!!

    using (var stream = new MemoryStream())
    
        qrCodeImage.Save(stream, ImageFormat.Png);
        return stream.ToArray();
    

这里是读取二维码的方法,也许有人也需要。 BarcodeReader 也从与 create 相同的命名空间生成。

方法如下

public static string ReadQrCode(byte[] qrCode)

    BarcodeReader coreCompatReader = new BarcodeReader();

    using (Stream stream = new MemoryStream(qrCode))
    
        using (var coreCompatImage = (Bitmap)Image.FromStream(stream))
        
            return coreCompatReader.Decode(coreCompatImage).Text;
        
    

希望这个答案能保护某人的头发不被拉扯。

【讨论】:

【参考方案2】:

有一个更新版本的包可用,它适用于 .NET Core 3.1。

https://www.nuget.org/packages/ZXing.Net.Bindings.Windows.Compatibility/

【讨论】:

与 .NET Core 完美配合【参考方案3】:

使用ZXing.Net v0.16.6时需要添加“Renderer = new ZXing.Rendering.BitmapRenderer()”

public static byte[] CreateQrCode(string content)

    byte[] imageData;

    var qrWriter = new ZXing.BarcodeWriter<System.Drawing.Bitmap>
    
        Format = BarcodeFormat.QR_CODE,
        Options = new ZXing.Common.EncodingOptions  Height = 100, Width = 100, Margin = 0 ,
        Renderer = new ZXing.Rendering.BitmapRenderer()
    ;

    using (var ms = new System.IO.MemoryStream())
    using (System.Drawing.Bitmap pixelData = qrWriter.Write(content))
    
        pixelData.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        imageData = ms.ToArray();
    

    return imageData;

【讨论】:

以上是关于ZXing QrCode 渲染器异常与 .Net Core 2.1的主要内容,如果未能解决你的问题,请参考以下文章

杂项-QRCode:ZXing

Java简单的生成/解析二维码(zxing qrcode)

Java简单的生成/解析二维码(zxing qrcode)

qrcode render 二维码扫描读取

C#用二维码中文乱码?请问怎么解决?或者有没有已经修改完zxing.dll文件?可以发一份否?希望

Java通过Zxing生成二维码