Исключение при визуализации ZXing QrCode с.Net Core 2.1
Я хотел бы создать QR-код с использованием 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();
}
}
4 ответа
Я решил проблему, в основном я использовал 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();
}
}
Вот метод чтения QR-кода, возможно, кому-то тоже понадобится. 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 6, и я использовалBarcodeWriter
отZXing.Net.Bindings.SkiaSharp
NuGet-пакет.
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);
Ваш стрим заполнен :)
Доступна более новая версия пакета, работающая с.NET Core 3.1.
https://www.nuget.org/packages/ZXing.Net.Bindings.Windows.Compatibility/
Мне нужно было добавить «Renderer = new ZXing.Rendering.BitmapRenderer()» при использовании ZXing.Net v0.16.6
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;
}