使用ZXing.Net生成二维码
所需依赖组件
从工程安装的ZXing.Net Nuget包查看,ZXing.Net不依赖其他组件。

查看package包内容,发现内部就zxing.dll和zxing.presentation.dll两个动态库文件。

ZXing.Net生成的二维码形式
生成的二维码形式为内存Bitmap图像对象,如果需保存为文件或Base64字符串需另外书写代码实现。
关于大小:将“测试Url文本”作为内容生成的内存Bitmap对象保存到本地jpg文件,发现大小为33KB。

ZXing.Net生成二维码性能调研:
对“测试Url文本”进行50次生成二维码操作,记录消耗时长(单位:毫秒)。
进行10次记录,分别:219、218、216、233、223、221、219、221、223、217,计算平均数为:198.7。经观察发现首次启动程序后执行生成二维码操作所耗时长差距较大(如:309),前面的10次记录排除了首次消耗时长。
完整代码
using System;
using System.Drawing;
using System.Windows.Forms;
using ZXing;
using ZXing.Common;
namespace QRCodeApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void generateQRCodeLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
string qrCodeContent = contentTextBox.Text.Trim();
int minValue = Math.Min(qrCodePictureBox.Width, qrCodePictureBox.Height);
int width = minValue;
int height = minValue;
// 生成二维码内存Bitmap对象
var qrImage = CodeHelper.GenerateQRCode(qrCodeContent, out string errorMessage, height, width, 1);
if (!string.IsNullOrEmpty(errorMessage))
{
MessageBox.Show(errorMessage);
return;
}
// 保存为本地jpg文件
qrImage.Save($"{DateTime.Now.Ticks}.jpg");
qrCodePictureBox.Image = qrImage;
// 解析二维码内容
string parsedConetnt = CodeHelper.ParseBarCode(qrImage);
Clipboard.SetText(parsedConetnt);
MessageBox.Show(parsedConetnt);
#region 测试性能
//Stopwatch stopwatch = new Stopwatch();
//stopwatch.Start();
//string url = "http://172.19.134.50:15866/home/toindex?zyh=7C9C27E3A77AB188C2F1F2964D5F95CB&kh=A007648177DE01AEF9C4B4EBC38B00D5&appId=315C119EB6B22411BA6F8E3CB767E214&token=382AB3C8441A478A800BE892F358B2D9400752295950261F61BE6764FC3EA1AB2FBE26BBD52AD9B37EC08BADD75482289A1F7219E6EAB4BF0864225D88D305001FC11A94282210F44B7632C186EF6096×tamp=A61A2B1E5D3DA278261D1850F9270DD3&ysdm=6134&clientIP=172.19.133.28";
//for (int i = 0; i < 50; i++)
//{
// var bitmap = CodeHelper.GenerateQRCode(url, out string _);
//}
//stopwatch.Stop();
//MessageBox.Show(stopwatch.ElapsedMilliseconds.ToString());
#endregion
}
}
public class CodeHelper
{
/// <summary>
/// 使用zxing动态库生成二维码
/// </summary>
/// <param name="conetnt">二维码内容</param>
/// <param name="errorMessage">异常信息</param>
/// <param name="logoPath">logo图片路径,默认为空。为空时生成的二维码不带logo</param>
/// <param name="height">二维码图片高度,默认240 单位 pixels</param>
/// <param name="width">二维码图片宽度,默认240 单位 pixels</param>
/// <param name="margin">二维码图片边距,默认为0</param>
/// <returns></returns>
public static Bitmap GenerateQRCode(string conetnt, out string errorMessage, string logoPath = "", int height = 240, int width = 240, int margin = 0)
{
errorMessage = string.Empty;
try
{
BarcodeWriter barCodeWriter = new BarcodeWriter();
barCodeWriter.Format = BarcodeFormat.QR_CODE;
barCodeWriter.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
barCodeWriter.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H);
barCodeWriter.Options.Height = height;
barCodeWriter.Options.Width = width;
barCodeWriter.Options.Margin = margin;
BitMatrix bm = barCodeWriter.Encode(conetnt);
Bitmap qrCodeImage = barCodeWriter.Write(bm);
if (!string.IsNullOrEmpty(logoPath))
{
// 添加Logo
Bitmap logo = new Bitmap(logoPath);
int logoSize = (int)(qrCodeImage.Width * 0.2); // Logo大小为二维码大小的1/5
int logoX = (qrCodeImage.Width - logoSize) / 2;
int logoY = (qrCodeImage.Height - logoSize) / 2;
Graphics qrGraphics = Graphics.FromImage(qrCodeImage);
qrGraphics.DrawImage(logo, new Rectangle(logoX, logoY, logoSize, logoSize));
}
return qrCodeImage;
}
catch (Exception ex)
{
errorMessage = $"Exception raised when generating QRCode,, Exception;{ex}";
return null;
}
}
/// <summary>
/// 使用zxing动态库解析
/// </summary>
/// <param name="image">二维码图像</param>
/// <returns></returns>
public static string ParseBarCode(Bitmap image)
{
BarcodeReader reader = new BarcodeReader();
Result result = reader.Decode(image);
return result.Text;
}
}
}
|
本文来自博客园,作者:业荒于嬉,转载请注明原文链接:https://www.cnblogs.com/FreeLoopPowter/p/18191800
如内容对您有所帮助,还请不吝推荐一下!

浙公网安备 33010602011771号