ZXing使用详解与范例(C#)
介绍
ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。(引自百度百科)
用途
生成一维码、二维码,支持各种格式(比如:Datamatrix、QR、Code39等)
解析一维码、二维码,支持各种格式(比如:Datamatrix、QR、Code39等)
源码
库
/// <summary>
/// 解码二维码
/// </summary>
/// <param name="barcodeBitmap">待解码的二维码图片</param>
/// <returns>扫码结果</returns>
public static string DecodeQrCode(Bitmap barcodeBitmap)
{
BarcodeReader reader = new BarcodeReader();
reader.Options.CharacterSet = "UTF-8";
var result = reader.Decode(barcodeBitmap);
return (result == null) ? null : result.Text;
}
/// <summary>
/// 生成二维码
/// </summary>
/// <param name="text">内容</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <returns></returns>
public static Bitmap Generate2DBarcode(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;
}
示例
private void Btn_Create2Dbarcode_Click(object sender, EventArgs e)
{
BarcodePicture.Image = null;
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start(); // 开始监视代码
Bitmap bmap=BarcodeHelper.Generate2DBarcode(CreateBarcode.Text, 100, 100);
stopwatch.Stop(); // 停止监视
BarcodePicture.Image = bmap;
TimeSpan timeSpan = stopwatch.Elapsed; // 获取总时间
double milliseconds = timeSpan.TotalMilliseconds; // 毫秒数
CreateTime.Text = "Identify Time:" + timeSpan.TotalMilliseconds + "ms";
/* Bitmap bmp = BarcodeHelper.Generate2DBarcode("123456", 100, 100);
//保存到磁盘文件
bmp.Save("C:/1.bmp");
bmp.Dispose();*/
}
private void Btn_Identify2Dbarcode_Click(object sender, EventArgs e)
{
log.Clear();
log.AppendText("Identify Start:"+System.DateTime.Now.TimeOfDay.ToString()+"\n");
uint a = timeGetTime();
IdentifyBarcode.Text = BarcodeHelper.DecodeQrCode((Bitmap)BarcodePicture.Image);
//IdentifyBarcode.Text = BarcodeHelper.DecodeQrCode(BarcodeHelper.Generate2DBarcode("123", 100, 100));
uint b = timeGetTime();
log.AppendText("Identify End:" + System.DateTime.Now.TimeOfDay.ToString() + "\n");
IdentifyTime.Text = "Identify Time:" + (b - a).ToString() + "ms";
}
运行效果
/// <summary>
/// 解码二维码
/// </summary>
/// <param name="barcodeBitmap">待解码的二维码图片</param>
/// <returns>扫码结果</returns>
public static string DecodeQrCode(Bitmap barcodeBitmap)
{
BarcodeReader reader = new BarcodeReader();
reader.Options.CharacterSet = "UTF-8";
var result = reader.Decode(barcodeBitmap);
return (result == null) ? null : result.Text;
}
/// <summary>
/// 生成二维码
/// </summary>
/// <param name="text">内容</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <returns></returns>
public static Bitmap Generate2DBarcode(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;
}
private void Btn_Create2Dbarcode_Click(object sender, EventArgs e)
{
BarcodePicture.Image = null;
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start(); // 开始监视代码
Bitmap bmap=BarcodeHelper.Generate2DBarcode(CreateBarcode.Text, 100, 100);
stopwatch.Stop(); // 停止监视
BarcodePicture.Image = bmap;
TimeSpan timeSpan = stopwatch.Elapsed; // 获取总时间
double milliseconds = timeSpan.TotalMilliseconds; // 毫秒数
CreateTime.Text = "Identify Time:" + timeSpan.TotalMilliseconds + "ms";
/* Bitmap bmp = BarcodeHelper.Generate2DBarcode("123456", 100, 100);
//保存到磁盘文件
bmp.Save("C:/1.bmp");
bmp.Dispose();*/
}
private void Btn_Identify2Dbarcode_Click(object sender, EventArgs e)
{
log.Clear();
log.AppendText("Identify Start:"+System.DateTime.Now.TimeOfDay.ToString()+"\n");
uint a = timeGetTime();
IdentifyBarcode.Text = BarcodeHelper.DecodeQrCode((Bitmap)BarcodePicture.Image);
//IdentifyBarcode.Text = BarcodeHelper.DecodeQrCode(BarcodeHelper.Generate2DBarcode("123", 100, 100));
uint b = timeGetTime();
log.AppendText("Identify End:" + System.DateTime.Now.TimeOfDay.ToString() + "\n");
IdentifyTime.Text = "Identify Time:" + (b - a).ToString() + "ms";
}
经过测试,在程序第一次生成和解析时,需要初始化(据我判断)时间会略长,但是之后速度很快,生成时间在5ms之内,解析时间在2ms之内,具体取决于实际应用。
最关键点在于图像。
备注:目前示例代码中只有2D QR条码的生成和解析。后续方法可以参考项目中的BarcodeHelper.cs
下载地址
我的Gitee下载地址:https://gitee.com/PErobin/Barcode-ZXing.git
官方Github地址:https://github.com/zxing/zxing
参考博客
ZXing的介绍和方法参数:https://www.jianshu.com/p/6607e69b1121
ZXing使用全解析,基于ZXing3.1:https://blog.csdn.net/dodod2012/article/details/51315112
该篇博客基于github提供介绍和使用:https://www.cnblogs.com/hnsongbiao/p/9145285.html
ZXing使用详解与范例(C#)的更多相关文章
- PHP中header用法详解带范例(转)
header的用法 header()函数的作用是:发送一个原始 HTTP 标头[Http Header]到客户端.标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的 ...
- ZXing开发详解
博客转载自:https://blog.csdn.net/skillcollege/article/details/38852183 什么是Z*? 在Android平台做过二维码相关模块的肯定都熟知ZX ...
- TestNG并发执行用例详解和范例
前言 TestNG有多种并发方式支持,方法的并发,class级的并发,test级的并发等:根据实际应用可以灵活的配置和使用,下面分别对几种并发方法进行说明: 一.方法级并发 方法级并发即method级 ...
- mongodb 3.2 yaml 配置详解及范例
mongodb3.x版本后就是要yaml语法格式的配置文件,下面是yaml配置文件格式如下:官方yaml配置文件选项参考:https://docs.mongodb.org/manual/ ... #c ...
- 3.awk数组详解及企业实战案例
awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...
- Linux下ps命令详解 Linux下ps命令的详细使用方法
http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...
- ElasticSearch第四步-查询详解
ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...
- Web.xml详解(转)
这篇文章主要是综合网上关于web.xml的一些介绍,希望对大家有所帮助,也欢迎大家一起讨论. ---题记 一. Web.xml详解: (一) web.xml加载过程(步骤) 首 ...
- scp命令详解
\ svn 删除所有的 .svn文件 find . -name .svn -type d -exec rm -fr {} \; linux之cp/scp命令+scp命令详解 名称:cp 使用权限: ...
随机推荐
- cmd内部命令和外部命令的区别
内部命令 我们可以直接在CMD下就可以执行的命令,例如:telnet.ftp.dir.cd.等等,你可以在CMD下输入help进行查看 外部命令 就是cmd下不能直接运行的命令,(例如大家常用的nc) ...
- LOCATE()和FIND_IN_SET()
locate(substr,str) 查找substr在str中第一次出现的位置,为空时返回0 SELECT login_name, LOCATE('ning',login_name) FROM us ...
- 错误代码errno值的含义
错误代码errno值的含义 查看错误代码errno是调试程序的一个重要方法.当C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义, ...
- mybatis捕获sql工具
今天给大家分享一款好用的软件 https://ssrss.space/register?aff=982689 日志级别必须是debug
- tomcat+redis接上篇
数据库允许远程连接 把数据库中的mysql数据库中的user表里的host项为localhost的改为 % update user set host = '%' where user = 'root' ...
- PAT Basic 1067 试密码 (20 分)
当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过 20 的.不包含空格. ...
- 【gin-vue-admin】 使用go和vue 快速搭建一个项目模板
gin-vue-admin gin+vue开源快速项目模板 项目地址:https://github.com/piexlmax/gin-vue-admin 增加了 micro-service-test分 ...
- python中英文翻译模块
从一种语言到另一种语言的文本翻译在各种网站中越来越普遍. 帮助我们执行此操作的python包称为translate. 可以通过以下方式安装此软件包. 它提供主要语言的翻译. 官网:https://py ...
- jquery 中 html与text函数的区别
jquery 中 html与text函数的区别 共同点:它们都能讲函数中的参数渲染到页面中: 异同点: text() 只是简单的讲参数的内容写入到页面中: html() 会根据参数的值,判断是否字体符 ...
- Java编程思想 第21章 并发
这是在2013年的笔记整理.现在重新拿出来,放在网上,重新总结下. 两种基本的线程实现方式 以及中断 package thread; /** * * @author zjf * @create_tim ...