.Net Core 2.1 的 ZXing QrCode 渲染器异常
ZXing QrCode renderer exception with .Net Core 2.1
我想用ZXing(0.16.4)创建一个QR码但是我遇到了以下异常,
System.InvalidOperationException: 'You have to set a renderer
instance.'
几乎相同的代码适用于 .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();
}
}
我解决了这个问题,基本上我用 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;
}
}
}
希望这个回答能保护别人的头发不被拉扯。
有更新版本的包可用,它适用于 .NET Core 3.1。
https://www.nuget.org/packages/ZXing.Net.Bindings.Windows.Compatibility/
我需要在使用 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(0.16.4)创建一个QR码但是我遇到了以下异常,
System.InvalidOperationException: 'You have to set a renderer instance.'
几乎相同的代码适用于 .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();
}
}
我解决了这个问题,基本上我用 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;
}
}
}
希望这个回答能保护别人的头发不被拉扯。
有更新版本的包可用,它适用于 .NET Core 3.1。
https://www.nuget.org/packages/ZXing.Net.Bindings.Windows.Compatibility/
我需要在使用 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;
}