首页 > 其他分享 >基于ZXing.NET实现的二维码生成和识别客户端

基于ZXing.NET实现的二维码生成和识别客户端

时间:2023-10-13 13:34:50浏览次数:42  
标签:string int ZXing 二维码 ex NET barCodeWriter qrCodeImage 客户端

一、前言

ZXing.Net的一个可移植软件包,是一个开源的、多格式的1D/2D条形码图像处理库,最初是用Java实现的。已经过大量优化和改进,它已经被手动移植。它与.Net 2.0、.Net 3.5、.Net 4.x、.Net 5.x、.Net 6.x、.Net 7.x、Windows RT类库和组件、UWP、.Net Standard 1.x和2.0x、.Net Core App 3.x、Silverlight 4、Silverlight 5、Windows Phone 7.x和Windows Phone 8.x以及Xamarin.Android兼容。

二、项目环境和搭建

项目框架:.NET Framework 4.6.1

项目依赖:ZXing.Net

image

项目结构和界面设计

image

三、实现核心代码

ZXing帮助类

 /// <summary>
 /// ZXing.NET 二维码帮助类
 /// </summary>
 public class ZXingHelper
 {

     /// <summary>
     /// 站点二维码的目录
     /// </summary>
     private static string QRCodeDirectory = "QRCode";
     /// <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;
     }

     /// <summary>
     /// 使用zxing动态库生成二维码
     /// </summary>
     /// <param name="conetnt">二维码内容</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 void GenerateQRCode(string conetnt, string logoPath = "", int height = 240, int width = 240, int margin = 0)
     {
         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));
             }
             string qrCodeFile = AppDomain.CurrentDomain.BaseDirectory + QRCodeDirectory + "/" + "qrcode.jpg";
             if (File.Exists(qrCodeFile))
             {
                 File.Delete(qrCodeFile);
             }
             qrCodeImage.Save(qrCodeFile, System.Drawing.Imaging.ImageFormat.Jpeg);//保存二维码图片
         }
         catch (Exception ex)
         {

         }
     }
 }

选择logo

    /// <summary>
    /// 选择logo
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btn_selectlogo_Click(object sender, EventArgs e)
    {
        try
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);//初始路径为桌面
            openFileDialog.Filter = "Logo图片|*.png;*.jpg;*.jpeg;*.ico";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                picLogo.Image = Image.FromFile(openFileDialog.FileName);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }

生成二维码

  /// <summary>
  /// 生成二维码
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void bt_generate_Click(object sender, EventArgs e)
  {
      try
      {
          string errorMsg = "";
          string content = rtbQRCodeContent.Text;
          if (string.IsNullOrWhiteSpace(content))
          {
              MessageBox.Show("二维码内容不能为空!");
              return;
          }

          picQRCode.Image = ZXingHelper.GenerateQRCode(content, out errorMsg);
          if (!string.IsNullOrWhiteSpace(errorMsg))
          {
              MessageBox.Show(errorMsg);
          }
      }
      catch (Exception ex)
      {
          MessageBox.Show(ex.Message);
      }
  }

识别二维码

  /// <summary>
  /// 识别二维码
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btn_identityQrCode_Click(object sender, EventArgs e)
  {
      try
      {
          if (picQRCode.Image == null)
          {
              MessageBox.Show("请先生成二维码!");
              return;
          }
          Bitmap Imagemap = new Bitmap(picQRCode.Image);
          string QRCodeResult = ZXingHelper.ParseBarCode(Imagemap);
          rtbQRCodeResult.Text = QRCodeResult;
      }
      catch (Exception ex)
      {
          MessageBox.Show(ex.Message);
      }
  }

保存二维码

  /// <summary>
  /// 保存二维码
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btn_save_Click(object sender, EventArgs e)
  {
      try
      {
          if (picQRCode.Image == null)
          {
              MessageBox.Show("请先生成二维码!");
              return;
          }
          SaveFileDialog saveFileDialog = new SaveFileDialog();
          saveFileDialog.Filter = "保存图片|*.png;*.jpg;*.jpeg";
          if (saveFileDialog.ShowDialog() == DialogResult.OK)
          {
              picQRCode.Image.Save(saveFileDialog.FileName, ImageFormat.Png);
              MessageBox.Show("保存成功!");
          }
      }
      catch (Exception ex)
      {
          MessageBox.Show(ex.Message);
      }
  }

四、实现演示

五、源码工具获取

关注公众号,后台回复关键字:二维码工具

标签:string,int,ZXing,二维码,ex,NET,barCodeWriter,qrCodeImage,客户端
From: https://www.cnblogs.com/wml-it/p/17761875.html

相关文章

  • Netty简介
    1.Netty概述Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端Netty的内部实现是很复杂的,但是Netty提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty是完全基于NIO实现的,所以整个Netty都是异步的。Netty是最流行的NIO框......
  • .NET MAUI播放音频文件,复制资源文件到安装目录。
    .NETMAUI我基本都是参考Android代码改造来的,官方文档=废品。参考:https://blog.csdn.net/wxzjn1027/article/details/82345604需要注意的是,流的加载过程是一个将音频解压为原始16位PCM数据的过程,由一个后台线程来进行处理异步,所以初始化后不能立即播放,需要等待一点时间。有以下......
  • 【Dotnet 工具箱】推荐一个使用Flutter编写的博客园客户端
    推荐一个使用Flutter编写的博客园客户端简单易用并且同时支持Android/Ios平台。功能包含博客园首页、新闻列表、博问列表、闪存、我的博客、知识库等。截图预览博客园首页新闻列表博问列表闪存列表我的我的资料我的博客知识库博客内容粉丝关注在启动项......
  • .Net核心级的性能优化(GC篇)
    1.前言大部分人对于.Net性能优化,都停留在业务层面。或者简单的.Net框架配置层面。本篇来看下.Net核心部分GC垃圾回收配置:保留VM,大对象,独立GC,节省内存等.Net8里面有很多的各种GC配置,用以帮助你的程序进行最大程度性能提升和优化。文章分为两部分,第一个是GC有哪些动作可以性能......
  • TimesNet:时间序列预测的最新模型
    2020年发布的N-BEATS、2022年发布的N-HiTS和2023年3月发布的PatchTST开始。N-BEATS和N-HiTS依赖于多层感知器架构,而PatchTST利用了Transformer架构。2023年4月发表了一个新的模型,它在时间序列分析的多个任务中实现了最先进的结果,如预测、imputation、分类和异常检测:TimesNet。T......
  • PHP 的 Websocket 客户端和服务器
     /*------------------------------------------------------*///--需要安装websocket,我用的是下面链接提供的//--https://github.com/Textalk/websocket-php/*------------------------------------------------------*///客户端require('vendor/autoload.php');$c......
  • 软件开发人员 Kubernetes 入门指南|Part 2
    在第1部分中,我们讲解了Kubernetes的核心组件,Kubernetes是一种开源容器编排器,用于在分布式环境中部署和扩展应用程序;我们还讲解了如何在集群中部署一个简单的应用程序,然后更改其副本数量以扩大或缩小其规模。 在本文中,我们将为您深入讲解Kubernetes提供的网络和监控功能,......
  • Kubernetes:根据进程 Pid 获取 Pod 名称
    前言在管理Kubernetes集群的过程中,我们经常会遇到这样一种情况:在某台节点上发现某个进程资源占用量很高,却又不知道是哪个容器里的进程。有没有办法可以根据进程PID快速找到Pod名称呢?解决假设现在有一个prometheus进程的PID是14338:要获取容器的ID,可以查看PID对应......
  • 4款.NET开源的Redis客户端驱动库
    前言今天给大家推荐4款.NET开源免费的Redis客户端驱动库(以下排名不分先后)。Redis是什么?Redis全称是REmoteDIctionaryService,即远程字典服务。Redis是一个使用C语言编写的、开源的(遵守BSD协议)、支持网络、可基于内存亦可持久化的日志型、Key-Value的NoSQL数据库。NewLife.......
  • win Server系统安装“.NET Framework 3.5”
    Win2012、Win2016中.NETFramework版本分别是4.5与4.6,因此需要手动安装 .NETFramework3.5。(Win2012和Win2016中的.NET3.5不通用)iso镜像sources/sxs目录中有 .NETFramework3.5安装文件(路径:sources/sxs)将文件单独放如一个目录当中,并在系统中调用   ......