C#生成二维码和条形码

C# 实现二维码和条形码生成:从入门到实战

文章目录

  • C# 实现二维码和条形码生成:从入门到实战
    • 一、引言
    • 二、准备工作
      • 2.1 开发环境搭建
      • 2.2 引入相关库
    • 三、生成条形码
      • 3.1 条形码基本概念
      • 3.2 使用[ZXing.Net](https://ZXing.Net)生成条形码
        • 3.2.1 核心代码实现
        • 3.2.2 代码调用与测试
    • 四、生成二维码
      • 4.1 二维码基本概念
      • 4.2 使用[ZXing.Net](https://ZXing.Net)生成二维码
        • 4.2.1 核心代码实现
        • 4.2.2 代码调用与测试
    • 五、生成带 Logo 的二维码
      • 5.1 实现思路
      • 5.2 代码实现

一、引言

最近项目开发中遇到了使用字符串生成二维码和条形码的需求,所以对这些知识做一个总结,方便后续参考。

二、准备工作

2.1 开发环境搭建

本文使用的开发工具是 Visual Studio 2022,创建的是WPF应用程序,项目创建过程不再赘述。

2.2 引入相关库

在 C# 中生成二维码和条形码,我们将使用ZXing.Net库。这是一个开源的库,支持生成和解析多种格式的二维码和条形码。下面是引入ZXing.Net库的详细步骤:

(1)在 Visual Studio 的 “解决方案资源管理器” 中,右键点击项目名称,选择 “管理 NuGet 程序包”。

(2)在打开的 “NuGet 包管理器” 窗口中,切换到 “浏览” 选项卡。

(3)在搜索框中输入 “ZXing.Net”,然后点击搜索按钮。

(4)在搜索结果中找到 “ZXing.Net” 包,点击 “安装” 按钮。

(5)阅读并接受许可协议,等待安装完成。

(6)安装完成后,在 “解决方案资源管理器” 的 “依赖项”->“包” 中可以看到 “ZXing.Net”,这表示库已经成功引入项目。

三、生成条形码

3.1 条形码基本概念

条形码是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符 。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。常见的条形码类型有 Code 39、Code 128、EAN-13 等。Code 39 码可表示数字、字母等信息,常用于工业、图书及票证的自动化管理;Code 128 码能表示 ASCII 0 到 ASCII 127 共计 128 个 ASCII 字符,在物流包裹追踪等场景中常用;EAN-13 码是国际物品编码协会制定的一种商品用条码,通用于全世界,我们日常购买的商品包装上所印的条码很多就是 EAN-13 码 ,由前缀部分、制造厂商代码、商品代码和校验码组成。条形码的应用场景极为广泛,在零售行业,收银员通过扫描商品的条形码,能快速获取商品的价格、名称等信息,完成结账流程,同时也方便商家进行库存管理;在物流行业,货物上的条形码记录了货物的发货地、目的地、订单号等信息,方便物流公司对货物进行分拣、运输和追踪。

3.2 使用ZXing.Net生成条形码

3.2.1 核心代码实现

下面是使用ZXing.Net生成条形码的 C# 代码示例:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZXing.Common;namespace ZXing.Net.Example
{public class BarcodeGenerator{public static Bitmap GenerateBarcode(string content, BarcodeFormat format, int width, int height, int margin){//创建BarcodeWriter对象,用于生成条形码BarcodeWriter writer = new BarcodeWriter();//设置条形码的编码格式,例如Code 128、Code 39等writer.Format = format;//设置条形码的相关参数writer.Options = new EncodingOptions{//设置条形码的宽度Width = width,//设置条形码的高度Height = height,//设置条形码的边距Margin = margin};//调用Write方法生成条形码图片,传入要编码的内容return writer.Write(content);}}
}
3.2.2 代码调用与测试

在主程序或测试方法中,可以这样调用上述生成条形码的方法:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace ZXing.Net.Example
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();//要生成条形码的内容string content = "1234567890";//选择条形码格式,这里使用Code 128BarcodeFormat format = BarcodeFormat.CODE_128;//条形码宽度int width = 300;//条形码高度int height = 100;//条形码边距int margin = 10;//调用生成条形码的方法Bitmap barcodeBitmap = BarcodeGenerator.GenerateBarcode(content, format, width, height, margin);//使用System.Drawing.Common中的Image类来显示图片using (System.Drawing.Image image = barcodeBitmap){//这里可以将image保存到文件系统或者显示在界面上,以下是简单保存到文件的示例image.Save("barcode.png", System.Drawing.Imaging.ImageFormat.Png);}BitmapImage bitmapImage = BitmapToBitmapImage(barcodeBitmap);testBarcode.Source = bitmapImage;}private BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap){BitmapImage bitmapImage = new BitmapImage();using (System.IO.MemoryStream ms = new System.IO.MemoryStream()){bitmap.Save(ms, ImageFormat.Png);bitmapImage.BeginInit();bitmapImage.StreamSource = ms;bitmapImage.CacheOption = BitmapCacheOption.OnLoad;bitmapImage.EndInit();bitmapImage.Freeze();}return bitmapImage;}}
}

四、生成二维码

4.1 二维码基本概念

二维码,又称二维条码,是一种用特定几何图形按黑白相间的方式在二维方向上记录数据信息的图形 。它的编码原理基于计算机的 “0” 和 “1” 比特流概念,通过黑白小方块(几何形体)来表示文字数值信息 。比如,黑色小方块代表 “1”,白色小方块代表 “0” ,这些小方块按特定规则排列,就能存储丰富的信息。

二维码具有诸多显著特点。首先是信息容量大,与一维条形码相比,它能够在有限的空间内存储更多的信息,像文本、图片、网址、文件等都能被存储。例如,火车票上的二维码就包含了车次、座位号、乘车人身份信息等大量内容 。其次,二维码纠错能力强,当二维码部分被污损、遮挡时,凭借其纠错算法,扫描设备仍能准确识别其中的信息 。一般来说,二维码的纠错等级可分为 L(7% 容错率)、M(15% 容错率)、Q(25% 容错率)、H(30% 容错率)四个等级 ,以 H 等级为例,即便有 30% 的码字损坏,也能正常解码。另外,二维码制作成本低,只需借助普通的图形处理软件和打印机,就能轻松生成和打印,而且它的识读速度快,在移动支付、信息查询等场景中,用户只需瞬间就能完成扫码操作。

常见的二维码类型有 QR Code、PDF417、Data Matrix 等 。QR Code 是目前应用最为广泛的二维码,像微信、支付宝的付款码、收款码等都采用了 QR Code 格式,它具有超高速识读的特性,很适合在工业自动化生产线管理等领域应用;PDF417 是一种堆叠式二维码,可表示数字、字母、二进制数据及汉字,信息密度高,常用于证件管理、执照年检等场景,比如一些国家的身份证、驾驶证上就使用了 PDF417 码来存储个人信息 ;Data Matrix 是一种矩阵式二维码,其突出特点是密度高,最小尺寸小,特别适用于小零件的标识,像电子元器件、精密仪器等产品上常常能看到 Data Matrix 码 。

二维码的应用场景十分广泛,在移动支付领域,人们通过扫描二维码就能快速完成支付,实现无现金交易,极大地提高了交易效率和便利性;在信息查询方面,博物馆的展品介绍、图书的相关信息等都能通过二维码来展示,用户扫描二维码即可获取详细内容;在身份识别领域,电子身份证、电子护照等都利用二维码来存储个人身份信息,方便快捷且安全可靠。

4.2 使用ZXing.Net生成二维码

4.2.1 核心代码实现

以下是使用ZXing.Net生成二维码的 C# 代码示例:

using System.Drawing;
using ZXing.Common;namespace ZXing.Net.Example
{public class QrCodeGenerator{public static Bitmap GenerateQRCode(string content, int width, int height, int margin){//创建BarcodeWriter对象,用于生成二维码BarcodeWriter writer = new BarcodeWriter();//设置二维码的编码格式为QR_CODEwriter.Format = BarcodeFormat.QR_CODE;//设置二维码的相关参数writer.Options = new EncodingOptions{//设置二维码的宽度Width = width,//设置二维码的高度Height = height,//设置二维码的边距Margin = margin};//调用Write方法生成二维码图片,传入要编码的内容return writer.Write(content);}}
}
4.2.2 代码调用与测试

在主程序或测试方法中,可以按照以下方式调用上述生成二维码的方法:

using System.Drawing;
using System.Windows;namespace ZXing.Net.Example
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();//要生成二维码的内容string content = "https://www.csdn.net/";//二维码宽度int width = 200;//二维码高度int height = 200;//二维码边距int margin = 5;//调用生成二维码的方法Bitmap qrCodeBitmap = QrCodeGenerator.GenerateQRCode(content, width, height, margin);//使用System.Drawing.Common中的Image类来显示图片using (System.Drawing.Image image = qrCodeBitmap){//这里可以将image保存到文件系统或者显示在界面上,以下是简单保存到文件的示例image.Save("qrcode.png", System.Drawing.Imaging.ImageFormat.Png);}}}
}

五、生成带 Logo 的二维码

5.1 实现思路

生成带 Logo 的二维码,我们可以分两步进行。首先,利用前面介绍的方法,借助ZXing.Net库先生成一个普通的二维码图片。然后,加载事先准备好的 Logo 图片,根据二维码图片的大小,合理调整 Logo 图片的尺寸,使其能够完美地融入二维码中。最后,使用System.Drawing命名空间下的Graphics类,将调整好大小的 Logo 图片绘制到二维码图片的中心位置,从而得到带 Logo 的二维码图片。

5.2 代码实现

以下是生成带 Logo 二维码的完整 C# 代码:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZXing.Common;namespace ZXing.Net.Example
{public class QrCodeWithLogoGenerator{public static Bitmap GenerateQRCodeWithLogo(string content, int width,int height, int margin, string logoPath){//先生成普通二维码BarcodeWriter writer = new BarcodeWriter();writer.Format = BarcodeFormat.QR_CODE;writer.Options = new EncodingOptions{Width = width,Height = height,Margin = margin};//加载Logo图片Bitmap logoBitmap = new Bitmap(logoPath);//计算Logo图片在二维码中的大小和位置int logoWidth = Math.Min((int)(width * 0.2), logoBitmap.Width);int logoHeight = Math.Min((int)(height * 0.2), logoBitmap.Height);int logoX = (width - logoWidth) / 2;int logoY = (height - logoHeight) / 2;//将Logo图片绘制到二维码图片上Bitmap qrCodeBitmap = writer.Write(content);using (Graphics g = Graphics.FromImage(qrCodeBitmap)){g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;g.DrawImage(logoBitmap, new Rectangle(logoX, logoY, logoWidth, logoHeight));}return qrCodeBitmap;}}
}

在主程序或测试方法中调用该方法的示例代码如下:

using System.Drawing;
using System.Windows;namespace ZXing.Net.Example
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();//要生成二维码的内容string content = "https://www.csdn.net/";//二维码宽度int width = 300;//二维码高度int height = 300;//二维码边距int margin = 10;//Logo图片路径string logoPath = "logo.png";//调用生成带Logo二维码的方法Bitmap qrCodeWithLogoBitmap = QrCodeWithLogoGenerator.GenerateQRCodeWithLogo(content, width, height, margin, logoPath);//使用System.Drawing.Common中的Image类来显示图片using (System.Drawing.Image image = qrCodeWithLogoBitmap){//这里可以将image保存到文件系统或者显示在界面上,以下是简单保存到文件的示例image.Save("qrcode_with_logo.png", System.Drawing.Imaging.ImageFormat.Png);}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++结构体介绍

结构体的定义 在C中&#xff0c;结构体&#xff08;struct&#xff09;是一种用户定义的数据类型&#xff0c;允许将不同类型的数据组合在一起。结构体的定义使用struct关键字&#xff0c;后跟结构体名称和一对花括号{}&#xff0c;花括号内包含成员变量的声明。 struct Pers…

各类音频放大器电路原理简析

A类&#xff08;甲类&#xff09;放大器 晶体管在整个信号周期内始终导通&#xff0c;导通角为360 本质上是一个简单的共源放大电路&#xff0c;M1 是放大管&#xff0c;M2 为电流源管负载&#xff0c;其最大输出电流受ID2控制&#xff0c;带负载能力弱。 B类&#xff08;乙类…

OpenCV的 ccalib 模块用于自定义标定板的检测和处理类cv::ccalib::CustomPattern()----函数calibrate

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ccalib::CustomPattern 是OpenCV的 ccalib 模块中的一个类&#xff0c;主要用于自定义标定板的检测和处理。这个模块提供了比传统的 calib3d…

【从零开始学习RabbitMQ | 第一篇】从异步通信到交换机

目录 前言 1.什么是RabbitMQ&#xff1f; 2.同步调用的优缺点 3.异步调用的优缺点 3.1优点&#xff1a; 3.2异步调用的问题是什么&#xff1f; 4技术选型 4.1AMQP协议就是&#xff1a; 4.2kafka和RabbitMQ的使用场景 5.安装RabitMq 6.rabitmq的整体架构 7.RabibtM…

Dify MCP实战 - 邮件发送

安装MCP sse插件 配置MCP Server 由于Dify 目前还没有支持stdio方式连接MCP Server。我们找到了Zapier&#xff0c;轻松调用 7000 App 工具。 Zapier配置 • 访问 https://actions.zapier.com/settings/mcp/ • 添加Gmail Send Email工具 • 授权自己的Gmail邮箱 • 复制Za…

uniapp 微信小程序使用图表

使用的是秋云 ucharts 直接在hbuilder插件市场进行下载导入项目中&#xff0c;多端支持 下载地址秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场 导入成功后这里就能看到导入的插件啦 导入项目后就可以直接在页面中通过组件使用了 不需要其余配置 使用简单 参…

Python数据脱敏技术在大模型机器学习中的深度应用与实践

一、数据脱敏技术体系详解 1.1 结构化数据脱敏技术 1.1.1 列级脱敏策略 import pandas as pd from faker import Fakerclass StructuredDataMasker:def __init__(self):self.faker =

【设计模式】GoF设计模式之策略模式(Strategy Pattern)

设计模式之策略模式 Strategy Pattern V1.0核心概念角色代码示例程序运行结果代码讲解 适用范围 V1.0 核心概念 策略模式是一种行为型设计模式&#xff0c;其核心思想是业务类执行某个动作时&#xff0c;可以使用该动作的不同的实现&#xff0c;并在程序运行中可以切换使用该…

VS Code配置指南:打造高效的QMK开发环境

VS Code配置指南&#xff1a;打造高效的QMK开发环境 前言 你是否曾为QMK固件开发环境的搭建而头疼不已&#xff1f;本文将手把手教你使用Visual Studio Code&#xff08;简称VS Code&#xff09;这款强大的代码编辑器来构建一个完美的QMK开发环境&#xff0c;让你的键盘固件开…

java CompletableFuture 异步编程工具用法1

1、测试异步调用&#xff1a; static void testCompletableFuture1() throws ExecutionException, InterruptedException {// 1、无返回值的异步任务。异步线程执行RunnableCompletableFuture.runAsync(() -> System.out.println("only you"));// 2、有返回值的异…

中国自动驾驶研发解决方案,第一!

4月28日&#xff0c;IDC《中国汽车云市场(2024下半年)跟踪》报告发布&#xff0c;2024下半年中国汽车云市场整体规模达到65.1亿元人民币&#xff0c;同比增长27.4%。IDC认为&#xff0c;自动驾驶技术深化与生成式AI的发展将为汽车云打开新的成长天花板&#xff0c;推动云计算在…

如何快速获取字符串的UTF-8或UTF-16编码二进制数据?数值转换成字符串itoa不是C标准?其它类型转换成字符串?其它类型转换成数值类型?

目录 如何快速获取字符串的UTF-8或UTF-16编码二进制数据? 数值转换成字符串itoa不是C标准&#xff1f; 其它类型转换成字符串 其它类型转换成数值类型 转换成数值的API 为什么有的编程语言允许字符串和整数相加? 字符串拼接 字符串字面量自动连接 如何快速获取字符串…

Android SDK 国内镜像及配置方法(2025最新,包好使!)

2025最新android sdk下载配置 1、首先你需要有android sdk manager2、 直接上教程修改hosts文件配置域名映射即可(不用FQ)2.1 获取ping dl.google.com域名ip地址2.2 配置hosts文件域名映射2.3 可以随意下载你需要的sdk3、 总结:走过弯路,踩过坑!!!大家就不要踩了!避坑1…

MySQL事务隔离机制与并发控制策略

MySQL事务隔离机制与并发控制策略 MySQL事务隔离机制与并发控制策略一、数据库并发问题全景解析二、事务隔离级别深度解析三、MySQL并发控制核心技术1. 多版本并发控制&#xff08;MVCC&#xff09;2. 锁机制 四、隔离级别实现差异对比五、生产环境最佳实践六、高级优化技巧七、…

Python `zip()` 函数是什么

Python zip() 函数是什么 在 Python 里,zip() 是一个内置函数,其主要作用是将多个可迭代对象(像列表、元组、字符串等)中的元素一一对应地组合成元组,最终返回一个迭代器,这个迭代器会生成这些元组。 基本语法 zip(*iterables)其中,*iterables 代表可变数量的可迭代对…

Jenkins 改完端口号启动不起来了

让我们将 Jenkins 恢复到默认的 8080 端口&#xff0c;确保它能正常启动&#xff1a; 1. 修改 Jenkins 的配置文件&#xff1a; sudo nano /etc/default/jenkins 将内容修改为&#xff1a; HTTP_PORT8080 JENKINS_ARGS"--webroot/var/cache/jenkins/war --httpPort8080…

【AWS+Wordpress-准备阶段】AWS注册+创建EC2实例

前言 自学笔记&#xff0c;解决问题为主&#xff0c;亲测有效&#xff0c;欢迎补充。 本地WP文件部署到AWS整体步骤如下&#xff1a;&#xff08;本文重点&#xff1a;AWS准备完成&#xff09; 0. [AWS 准备] 注册 AWS 并创建 EC2 实例 ↓ 1. [生成安装包&#xff1a;用 Du…

使用pytorch保存和加载预训练的模型方法

需要使用到的函数 在 PyTorch 中&#xff0c;torch.save() 和 torch.load() 是用于保存和加载模型的核心函数。 torch.save() 函数 主要用途&#xff1a;将模型或模型的状态字典&#xff08;state_dict&#xff09;保存到文件中。 语法&#xff1a; torch.save(obj, f, pi…

Python从入门到高手8.3节-元组的常用操作方法

目录 11.3.1 元组的常用操作方法 11.3.2 元组的查找 11.3.3 祈祷明天不再打雷下雨 11.3.1 元组的常用操作方法 元组类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法&#xff0c;在本节的内容中&#xff0c;着重介绍元组类型的操作方法。 ​ 元组是…

图书推荐(协同过滤)算法的实现:基于订单购买实现相似用户的图书推荐

代码部分 package com.ruoyi.system.service.impl;import com.ruoyi.system.domain.Book; import com.ruoyi.system.domain.MyOrder; import com.ruoyi.system.mapper.BookMapper; import com.ruoyi.system.mapper.MyOrderMapper; import com.ruoyi.system.service.IBookRecom…