使用.Net Core 2.1时出现ZXing QrCode渲染器异常

9
我想使用ZXing(0.16.4)创建一个QR码,但遇到了以下异常:

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();
    }
}
4个回答

7
我解决了这个问题,基本上我使用了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;
        }
    }
}

希望这个回答能够保护某人的头发免受拉扯。


3

我目前正在迁移到 .net 6,并且我使用了来自 ZXing.Net.Bindings.SkiaSharp NuGet 包的 BarcodeWriter

using ZXing.SkiaSharp;

var barcodeWriter = new BarcodeWriter
{
     Format = BarcodeFormat.QR_CODE,
     Options = new EncodingOptions
     {
         Height = _height,
         Width = _width,
         Margin = _margin
     }
};
using var bitmap = barcodeWriter.Write(qrValue);
using var stream = new MemoryStream();
bitmap.Encode(stream, SKEncodedImageFormat.Png, 100);

你的流现在已经填满了 :)


3

完美地与.NET Core配合使用。 - deanwilliammills

1
我在使用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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接