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

基于,zxing,net,实现,二维码,生成,识别,客户端 · 浏览次数 : 114

小编点评

**代码工具获取关注公众号** * 打开微信开发者模式 * 获取关注公众号ID * 获取关注公众号名称 **其他** * 生成二维码时需要带简单的排版 * 将排版信息加入到二维码内容中 * 在保存二维码时需要带关注公众号名称

正文

一、前言

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);
                logPath = openFileDialog.FileName;//logo文件路径
            }
        }
        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, logPath);
          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);
      }
  }

四、实现演示

image

五、源码工具获取

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

与基于ZXing.NET实现的二维码生成和识别客户端相似的内容:

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

一、前言 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类库和

基于 Three.js 的 3D 模型加载优化

作为一个3D的项目,从用户打开页面到最终模型的渲染加载的时间也会比普通的H5项目要更长一些,从而造成大量的用户流失。为了提升首屏加载的转化率,需要尽可能的降低loading的时间。这里就分享一些我们在模型加载优化方面的心得。

基于MindSpore实现BERT对话情绪识别

本文分享自华为云社区《【昇思25天学习打卡营打卡指南-第二十四天】基于 MindSpore 实现 BERT 对话情绪识别》,作者:JeffDing。 模型简介 BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Trans

基于 Vagrant 手动部署多个 Redis Server

环境准备 宿主机环境:Windows 10 虚拟机环境:Vagrant + VirtualBox Vagrantfile 配置 首先,我们需要编写一个 Vagrantfile 来定义我们的虚拟机配置。假设已经在 D:\Vagrant\redis 目录下创建了一个 Vagrantfile,其内容如下:

基于EF Core存储的Serilog持久化服务

前言 Serilog是 .NET 上的一个原生结构化高性能日志库,这个库能实现一些比内置库更高度的定制。日志持久化是其中一个非常重要的功能,生产环境通常很难挂接调试器或者某些bug的触发条件很奇怪。为了在脱离调试环境的情况下尽可能保留更多线索来辅助解决生产问题,持久化的日志就显得很重要了。目前Ser

基于EF Core存储的国际化服务

前言 .NET 官方有一个用来管理国际化资源的扩展包Microsoft.Extensions.Localization,ASP.NET Core也用这个来实现国际化功能。但是这个包的翻译数据是使用resx资源文件来管理的,这就意味着无法动态管理。虽然官方有在文档中提供了一些第三方管理方案,但是都不太

基于FileZilla上传、下载服务器数据的方法

本文介绍FileZilla软件的下载、配置与使用方法。 在之前的博客中,我们提到了下载高分遥感影像数据需要用到FTP(文件传输协议,File Transfer Protocol)软件FileZilla;这一软件用以在自己的电脑与服务器之间相互传输数据,在进行下载科学数据、网站开发等等操作时,经常需要

Vite5+Electron聊天室|electron31跨平台仿微信EXE客户端|vue3聊天程序

基于electron31+vite5+pinia2跨端仿微信Exe聊天应用ViteElectronChat。 electron31-vite5-chat原创研发vite5+electron31+pinia2+element-plus跨平台实战仿微信客户端聊天应用。实现了聊天、联系人、收藏、朋友圈/短

基于 .net core 8.0 的 swagger 文档优化分享-根据命名空间分组显示

之前也分享过 Swashbuckle.AspNetCore 的使用,不过版本比较老了,本次演示用的示例版本为 .net core 8.0,从安装使用开始,到根据命名空间分组显示,十分的有用

跟我一起学习和开发动态表单系统-前端用vue、elementui实现方法(3)

基于 Vue、Element UI 和 Spring Boot + MyBatis 的动态表单系统前端实现解析 在现代企业信息系统中,动态表单是一种非常常见的功能。它可以根据业务需求灵活地调整表单结构,以满足不同的数据收集和展示需求。在本文中,我们将探讨一种基于 Vue、Element UI 和 S