C#轻松实现条形码二维码生成及识别

ops/2025/1/17 19:39:27/

一、前言

大家好!我是付工。

今天给大家分享一下,如何基于C#来生成并识别条形码或者二维码。

二、ZXing.Net

实现二维码生成的库有很多,我们这里采用的是http://ZXing.Net。

ZXing是一个开放源码的,用Java实现的多种格式的一维二维条码图像处理库,而http://ZXing.Net是ZXing在.Net平台下的实现。

我们通过Nuget搜索http://zxing.net即可搜索安装。

三、BarCodeHelper

安装好http://ZXing.Net后,我们创建一个BarCodeHelper,对于进行封装,封装了以下几个方法:

方法一:生成条形码

public static Bitmap GenerateBarCode(string text, int width, int height)
{BarcodeWriter writer = new BarcodeWriter();writer.Format = BarcodeFormat.CODE_39;EncodingOptions options = new EncodingOptions(){Width = width,Height = height,Margin = 2,PureBarcode = true};writer.Options = options;Bitmap map = writer.Write(text);return map;
}

方法二:生成二维码

public static Bitmap GenerateQRCode(string text, int width, int height)
{BarcodeWriter writer = new BarcodeWriter();writer.Format = BarcodeFormat.QR_CODE;QrCodeEncodingOptions options = new QrCodeEncodingOptions(){DisableECI = true,//设置内容编码CharacterSet = "UTF-8",  //设置二维码的宽度和高度Width = width,Height = height,Margin = 1//设置二维码的边距,单位不是固定像素};writer.Options = options;Bitmap map = writer.Write(text);return map;
}

方法三:生成带Logo二维码

public static Bitmap GenerateQRCodeWithLogo(string text, int width, int height, Bitmap logo)
{//构造二维码写码器MultiFormatWriter writer = new MultiFormatWriter();Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>();hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//生成二维码 BitMatrix bm = writer.encode(text, BarcodeFormat.QR_CODE, width, height, hint);BarcodeWriter barcodeWriter = new BarcodeWriter();Bitmap map = barcodeWriter.Write(bm);//获取二维码实际尺寸int[] rectangle = bm.getEnclosingRectangle();//计算插入图片的大小和位置int middleW = Math.Min((int)(rectangle[2] / 3.5), logo.Width);int middleH = Math.Min((int)(rectangle[3] / 3.5), logo.Height);int middleL = (map.Width - middleW) / 2;int middleT = (map.Height - middleH) / 2;Bitmap bmpimg = new Bitmap(map.Width, map.Height, PixelFormat.Format32bppArgb);using (Graphics g = Graphics.FromImage(bmpimg)){g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;g.DrawImage(map, 0, 0, width, height);}//将二维码插入图片Graphics myGraphic = Graphics.FromImage(bmpimg);//白底myGraphic.FillRectangle(Brushes.Transparent, middleL, middleT, middleW, middleH);myGraphic.DrawImage(logo, middleL, middleT, middleW, middleH);return bmpimg;
}

方法四:识别条码二维码

public static string ReadCode(Bitmap bitmap)
{BarcodeReader barcodeReader = new BarcodeReader();barcodeReader.Options.CharacterSet = "UTF-8";Result result = barcodeReader.Decode(bitmap);return result.Text;
}

四、案例应用

有了以上方法后,编写一个案例来进行功能测试。

按钮事件代码很简单,就是调用BarCodeHelper中的对应方法即可:

private void btn_BarCode_Click(object sender, EventArgs e)
{this.pic_BarCode.Image = BarCodeHelper.GenerateBarCode(this.txt_BarCode.Text, this.pic_BarCode.Width, this.pic_BarCode.Height);
}private void btn_QRCode_Click(object sender, EventArgs e)
{if (chk_Logo.Checked){this.pic_QRCode.Image = BarCodeHelper.GenerateQRCodeWithLogo(this.txt_QRCode.Text,
this.pic_QRCode.Width, this.pic_QRCode.Height, new Bitmap(this.pic_Logo.Image));}else{this.pic_QRCode.Image = BarCodeHelper.GenerateQRCode(this.txt_QRCode.Text, this.pic_QRCode.Width, this.pic_QRCode.Height);}
}private void btn_ReadQRCode_Click(object sender, EventArgs e)
{MessageBox.Show(BarCodeHelper.ReadCode(new Bitmap(this.pic_QRCode.Image)));
}private void btn_ReadBarCode_Click(object sender, EventArgs e)
{MessageBox.Show(BarCodeHelper.ReadCode(new Bitmap(this.pic_BarCode.Image)));
}

最终实现效果如下所示:


http://www.ppmy.cn/ops/150899.html

相关文章

pytorch小记(六):pytorch中的clone和detach操作:克隆/复制数据 vs 共享相同数据但 与计算图断开联系

pytorch小记&#xff08;六&#xff09;&#xff1a;pytorch中的clone和detach操作&#xff1a;克隆/复制数据 vs 共享相同数据但 与计算图断开联系 1. x.clone()示例&#xff1a; 2. x.detach()示例&#xff1a;使用场景&#xff1a; 3. torch.tensor(x).float()示例&#xff…

MYSQL的第一次作业

目录 前情提要 题目解析 连接并使用数据库 创建employees表 创建orders表 创建invoices表 ​查看建立的表 前情提要 需要下载mysql并进行配置&#xff0c;建议下载8.0.37&#xff0c;详情可见MySQL超详细安装配置教程(亲测有效)_mysql安装教程-CSDN博客 题目解析 …

java进行pdf文件压缩

文章目录 pdf文件压缩 pdf文件压缩 添加依赖 <dependency><groupId>com.luhuiguo</groupId><artifactId>aspose-pdf</artifactId><version>23.1</version> </dependency>public class OptimizePdf {public static void opti…

[Unity] 【图形渲染】Unity Shader光照基础2-标准光照模型

在早期的游戏开发中,游戏引擎大多使用标准光照模型来模拟光线如何与物体表面交互。虽然现代引擎通常会采用更复杂的光照技术,但标准光照模型依然是一个关键概念,特别是在实时渲染中。在本文中,我们将深入探讨Unity标准光照模型的各个组成部分,了解光线如何与物体表面相互作…

【Uniapp-Vue3】响应式单位rpx及搭配使用UI产品工具

我们在编写CSS的时候&#xff0c;如果单位使用px&#xff0c;就会导致大小固定&#xff0c;但是如果我们想要根据不同的设备改变大小就要使用rpx作为单位。 rpx是以宽度为750的设计图得出的数据&#xff0c;以即时设计的设计稿为例&#xff1a; 该设计稿的宽度是375px 选中这…

【cs.LG】25.1.15 arxiv更新速递

【cs.LG】25.1.15 arxiv更新100篇 —第1篇---- Reward Machines for Deep RL in Noisy and Uncertain Environments &#x1f50d; 关键词: Reward Machines, Deep RL, Noisy Environments, Uncertain Environments, POMDP 链接1 摘要: Reward Machines 是一种受自动机启发…

jenkins-视图管理

一. 简述&#xff1b; jenkins默认只有一个All的view&#xff0c; 在我们线上环境中(测试、预发布、线上、端、语言环境等)&#xff0c;显然是不合理的(放在一个view中不编译管理)。我们可以通过一个dashboard view的插件来进行多个view(按环境&#xff0c;业务等分隔均可)管理…

蚁群算法(Ant Colony Optimization, ACO):各领域应用、相关学术分享

目录 1. 旅行商问题&#xff08;TSP&#xff09; 2. 车辆路径规划 3. 任务调度 4. 网络路由 5. 图像处理与计算机视觉 6. 组合优化问题 7. 功能优化与控制系统 8. 机器学习与特征选择 9. 跨层优化 相关学术会议分享 蚁群算法&#xff08;Ant Colony Optimization, A…