博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用ZXing.Net生成与识别二维码(QR Code)
阅读量:4988 次
发布时间:2019-06-12

本文共 4292 字,大约阅读时间需要 14 分钟。

Google ZXing是目前一个常用的基于Java实现的多种格式的1D/2D条码图像处理库,出于其开源的特性其现在已有多平台版本。比如今天要用到的ZXing.Net就是针对微软.Net平台的版本。

使用Google ZXing生成和识别二维码
使用Zxing制作二维码需要提供最少包括

①是否使用ECI编码段——QrCodeEncodingOptions.DisableECI;②内容编码格式(一般为UTF-8)——QrCodeEncodingOptions.CharacterSet;③二维码的宽高(以像素计)——QrCodeEncodingOptions. Width和QrCodeEncodingOptions. Height;④二维码的边距(以像素计)——QrCodeEncodingOptions. Margin;⑤需承载的内容——String字符串。

共计5种参数。

下面的代码为基于C#.Net Winform窗体使用Zxing.Net类库生成的标准二维码。

//以一个函数调用,text为需要生成的内容      public void Normal(string text)      {          //调用saveFileDialog选择导出二维码保存位置          string filename = saveFileDialog.FileName;          //初始化          BarcodeWriter writer = new BarcodeWriter();          writer.Format = BarcodeFormat.QR_CODE;          QrCodeEncodingOptions options = new QrCodeEncodingOptions();          //禁用ECI          options.DisableECI = true;          //内容编码格式          options.CharacterSet = cbx_code.Text;          //二维码的宽高          options.Width = int.Parse(tbx_width.Text);          options.Height = int.Parse(tbx_height.Text);          //二维码边距          options.Margin = int.Parse(tbx_margin.Text);          writer.Options = options;          //导出图片          Bitmap p = writer.Write(text);          p.Save(filename, System.Drawing.Imaging.ImageFormat.Png);          p.Dispose();          //在程序中加载导出的二维码          pictureBox.ImageLocation = filename;      }

    除去生成标准的二维码,还可以生成中间带有Logo的个性化二维码,如下图。
    以下是实现代码。

public void GenerateWithLogo(string text)              {                  //调用openFileDialog选择要插入的Logo                  openFileDialog.ShowDialog();                  Bitmap logo = new Bitmap(openFileDialog.FileName);                  //调用saveFileDialog选择保存位置                  saveFileDialog.ShowDialog();                  //初始化                  MultiFormatWriter writer = new MultiFormatWriter();                  Dictionary
hint = new Dictionary
(); hint.Add(EncodeHintType.CHARACTER_SET, cbx_code.Text); hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //生成二维码 BitMatrix bm = writer.encode(text, BarcodeFormat.QR_CODE, int.Parse(tbx_width.Text), int.Parse(tbx_height.Text), hint); BarcodeWriter barcodeWriter = new BarcodeWriter(); Bitmap map = barcodeWriter.Write(bm); //计算尺寸 int[] rectangle = bm.getEnclosingRectangle(); //计算插入Logo的大小位置 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; //将img转换成bmp格式,否则后面无法创建Graphics对象 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); } //将二维码插入图片 Graphics myGraphic = Graphics.FromImage(bmpimg); //白底 myGraphic.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH); myGraphic.DrawImage(logo, middleL, middleT, middleW, middleH); //保存成图片 bmpimg.Save(saveFileDialog.FileName, System.Drawing.Imaging.ImageFormat.Png); pictureBox.ImageLocation = saveFileDialog.FileName; }

相比于生成,识别二维码则要简单很多。

public void LoadQRC(string filename)             {                 BarcodeReader reader = new BarcodeReader();                 //设置读取的格式(一般为UTF-8)                 reader.Options.CharacterSet = cbx_loadcode.Text;                 Bitmap p = new Bitmap(filename);                 Result result = reader.Decode(p);                             rtbx.Text = result.ToString();             }

 

转载于:https://www.cnblogs.com/hnsongbiao/p/9145680.html

你可能感兴趣的文章
Linux虚拟地址空间布局以及进程栈和线程栈总结(转)
查看>>
批量部署ssh信任关系
查看>>
Asp.Net 高性能ORM框架——SqlSugar
查看>>
合并两个 Lambda 表达式
查看>>
dateDiff 用法
查看>>
2991:2011 (数学)
查看>>
1370:最小函数值
查看>>
windows服务和一般win程序打包安装
查看>>
Sublime Text web开发神器
查看>>
linux sudo 系统环境变量 用户环境变量
查看>>
Java语法基础(1)
查看>>
;(function(){ //代码})(); 自执行函数开头为什么要加;或者!
查看>>
201521123096《Java程序设计》第十三周学习总结
查看>>
【luogu P1082 同余方程】 题解
查看>>
数据结构 | 哈希表二次探查法 : 1078
查看>>
纯css实现DIV以及图片水平垂直居中兼容多种浏览器(实现过程)
查看>>
[转载]记不住ASP.NET页面生命周期的苦恼
查看>>
Oracle GoldenGate 二、配置和使用
查看>>
第六次作业
查看>>
Primes on Interval(二分 + 素数打表)
查看>>