首页 > 其他分享 >使用ZXing.Net生成二维码

使用ZXing.Net生成二维码

时间:2024-05-14 17:30:33浏览次数:30  
标签:string int ZXing 二维码 Net Bitmap barCodeWriter

所需依赖组件

从工程安装的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;
        }
    }
}

标签:string,int,ZXing,二维码,Net,Bitmap,barCodeWriter
From: https://www.cnblogs.com/FreeLoopPowter/p/18191800

相关文章

  • 探究——C# .net 代码混淆/加壳
    背景:保密。过程:先查询一下常见的加壳工具:DotFuscator,官方自带,据说免费版混淆程度不高ConfuserEx,只支持.NETFramework2.0/3.0/3.5/4.0/4.5/4.6/4.7/4.8,不支持.NETCoreVirboxProtector,很好很优秀,但是收费NETReactor,最新6.9版收费,PJ版到4.9不支持.NETCoreObfu......
  • java.net.SocketException: Connection reset
    今天在学习socket编程的时候遇到了一个bug:java.net.SocketException:Connectionreset先来看一下自己的代码:服务端:publicclassServerSocketDemo{publicstaticvoidmain(String[]args){try{//建立一个ServerSocketServerS......
  • 数据库升级PostgreSql+Garnet
    目录前言PostgreSql安装测试额外Nuget安装Person.cs模拟运行Navicate连postgresql解决方案Garnet为什么要选择Garnet而不是RedisRedis不再开源Windows版的Redis是由微软维护的WindowsRedis版本老旧,后续可能不再更新Garnet性能强于Redis安装测试安装可视化工具C#代码连接测试总结......
  • Wireless Network
    描述AnearthquaketakesplaceinSoutheastAsia.TheACM(AsiaCooperatedMedicalteam)havesetupawirelessnetworkwiththelapcomputers,butanunexpectedaftershock(预余震)attacked,allcomputersinthenetworkwereallbroken.Thecomputersarerepai......
  • 易易二维码,多功能在线文件预览与二维码生成器
    一、引言在数字化时代,信息的传递与分享变得尤为重要。无论是商务文件、个人文档,还是活动宣传、产品推广,都需要一种高效、便捷的方式来进行信息的展示与分享。易易二维码,作为一款集多WPS、Office文件在线预览、二维码设计、二维码在线报名、网址、图文、文件转二维码以及二维码浏......
  • Advanced .Net Debugging 8:线程同步
    一、介绍这是我的《Advanced.NetDebugging》这个系列的第八篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第六章【同步】。我们经常写一些多线程的应用程序,写的多了,有关多线程的问题出现的也就多了,因此,最迫切的任务就是提高解决多线程同步问题的能力。这一节......
  • Kubernetes
    Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes拥有一个庞大且快速增长的生态系统,其服务、支持和工具的使用范围广泛。小提示:系统配置文件Linux系统启动后,默认从以下系统配置文件加载内核参数:/run/sy......
  • .NET周刊【5月第1期 2024-05-05】
    国内文章一个开源轻量级的C#代码格式化工具(支持VS和VSCode)https://www.cnblogs.com/Can-daydayup/p/18164905CSharpier是一个开源、免费的C#代码格式化工具,特点是轻量级且依赖Roslyn引擎重构代码格式。支持的IDE包括VisualStudio(2019与2022)和VisualStudioCode等。该项......
  • skynet框架:并发热点处理方案
    对于关键流程,所有请求都要求返回有效结果,如创建socket连接:functionluasocket:connect() returnsocketcore.open(self.__host,self.__port)end显然外部调用需要获取到正确的socket句柄用于数据交互,当并发调用此接口时,所有调用都需要获取到有效的句柄以保证业务正常;方案......
  • Linux上安装dotnet
    安装dotnet下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet选择.NET7.0选择SDK7.0.408的Linux版本的x64版本https://dotnet.microsoft.com/zh-cn/download/dotnet/thank-you/sdk-7.0.408-linux-x64-binaries打开压缩包所在文件夹,在压缩包所在文件......