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 使用权限: ...
随机推荐
- linux查看网络ip得两个命令ifconfig和 ip addr
在安装linux 得时候,我们要选择桥接网络,相当于本电脑和虚拟机得电话都是接通外网,linux查看网络ip得两个命令ifconfig和 ip addr 1,命令ifconfig 如果ifconfig ...
- filebeat开启自带模块收集日志如何辨别日志来源等
filebeat启动自带模块后,日志先输出到Redis中 比如开启了system模块日志和redis模块日志 在Redis中查看收集过来的日志时,可以看到如下的这些信息 system日志信息 { &q ...
- ElasticSearch实战系列四: ElasticSearch理论知识介绍
前言 在前几篇关于ElasticSearch的文章中,简单的讲了下有关ElasticSearch的一些使用,这篇文章讲一下有关 ElasticSearch的一些理论知识以及自己的一些见解. 虽然本人是 ...
- Java Blob类型和String类型相互转换
1.String 转 Blob: String content = "Hello World!"; Blob blob = Hibernate.createBlob(content ...
- 完整阿里云Redis开发规范
完整阿里云Redis开发规范 原文地址 本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 删除bigkey 通过本文的介绍可以减少使用R ...
- Python3使运行暂停的方法
在Python3中已经有很大一部分语句与Python2不互通了,运行暂停的方法也有所不同. 1.input(); 这种方法不用包含模块,因此这也是最常用的一种暂停手段. Python2中的raw_in ...
- Wine-Staging 4.9 发布,增添一些新补丁
Wine-Staging的工作还在继续,到4.9版为止,在上游Wine代码库上有超过830个补丁. 在上周五的Wine 4.9发布之后,Wine-Staging 4.9已经发布了,之前的一些暂存工作现 ...
- 23_1spring基础
1.spring是什么 2.spring的优势 3.spring体系结构 4.耦合 程序间的依赖关系:类之间的依赖和方法之间的依赖. 解构:降低程序间的依赖关系. 实际开发中应该做到:编译期不依赖,实 ...
- 【NOIP2014模拟8.25】地砖铺设
题目 在游戏厅大赚了一笔的Randy 终于赢到了他想要的家具.乘此机会,他想把自己的房间好好整理一 下. 在百货公司,可以买到各种各样正方形的地砖,为了美观起见,Randy 不希望同样颜色的正方形地 ...
- 编译caffe-gpu-cuda及cudnn-tar 下载地址
y下载 https://github.com/BVLC/caffe https://github.com/BVLC/caffe/archive/master.zip gcc caffe安装 有2个问题 ...