条形码研究-QR 二维码

简介:

引入:

现在有了微信,所以有了形形色色的二维码,特别是我天天赶地铁上班,在地铁站内充斥着各个二维码,还有火车票右下角都有二维码。其实我们这里经常用到的二维码是 QR二维码,它是由日本人发明的,是二维码的一种。

从大体上看,一般一个QR二维码结构如下,其中有3个定位标志,右下角是校验标志,还有一些定时标志,版本信息,格式信息,这些肉眼不能识别,但是特殊设备却能读取。

164007282.png

关于QR二维码的信息,可以参见以下文章:

http://zh.wikipedia.org/wiki/QR%E7%A2%BC



实践:

我们这里就用JAVA代码来实现生成QR二维码图片以及如何从二维码图片中还原出原始文本内容,我们依然使用ZXing库:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package  com.charles.study.barcode.twodimensions;
import  java.awt.image.BufferedImage;
import  java.io.File;
import  java.util.HashMap;
import  java.util.Hashtable;
import  java.util.Map;
import  javax.imageio.ImageIO;
import  com.google.zxing.BarcodeFormat;
import  com.google.zxing.BinaryBitmap;
import  com.google.zxing.DecodeHintType;
import  com.google.zxing.EncodeHintType;
import  com.google.zxing.LuminanceSource;
import  com.google.zxing.MultiFormatReader;
import  com.google.zxing.MultiFormatWriter;
import  com.google.zxing.Result;
import  com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import  com.google.zxing.client.j2se.MatrixToImageWriter;
import  com.google.zxing.common.BitMatrix;
import  com.google.zxing.common.HybridBinarizer;
import  com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
/**
  * 这个工具类用于处理编码/解码 二维码
  * @author charles.wang
  *
  */
public  class  TwoDimensionCodeUtil {
                                                                                                                         
     private  TwoDimensionCodeUtil(){}
                                                                                                                         
                                                                                                                         
     /**
      * 基于一个字符串生成相对应的QR二维码,有指定的宽度和高度,并且存放到指定位置的文件中
      * @param contents
      * @param width
      * @param height
      * @param fileName
      * @throws Exception
      */
     public  static  void  generate2DBarCodeImage(String contents , int  width, int  height,String fileName)  throws  Exception{
                                                                                                                             
         //这里略去入参检查,因为不是重点
                                                                                                                             
                                                                                                                             
         //配置Q-R 二维码的信息
         Hashtable hints=  new  Hashtable();
         // 定义纠错等级
         hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
         // 指定二维码的编码规则
         hints.put(EncodeHintType.CHARACTER_SET,  "utf-8" );
                                                                                                                             
         //创建二维码对应的位图矩阵信息
         BitMatrix bitMetrix =  new  MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height,hints);
                                                                                                                             
         //从入参获取文件格式
         String fileFormat = fileName.substring(fileName.lastIndexOf( "." )+ 1 ,fileName.length());
         //从入参创建文件对象
         File outputFile =  new  File(fileName);
                                                                                                                             
         //吧位图矩阵写入指定的图片文件中
         MatrixToImageWriter.writeToFile(bitMetrix,fileFormat,outputFile);
     }
                                                                                                                         
                                                                                                                         
     /**
      * 读取一个QR二维码图片文件,还原其原始信息
      * @param imagePath
      * @return
      */
     public  static  String resolve2DBarCodeImage(String imagePath){
                                                                                                                             
         BufferedImage image =  null ;
         try  {
                                                                                                                                 
             //读取二维码图片文件
             image = ImageIO.read( new  File(imagePath));
             if  (image ==  null ) {
                 System.out.println( "二维码图片不存在." );
             }
                                                                                                                                     
             LuminanceSource source =  new  BufferedImageLuminanceSource(image);
             BinaryBitmap bitmap =  new  BinaryBitmap( new  HybridBinarizer(source));
                                                                                                                       
                                                                                                                                 
             //设置二维码的解码规则
             Map<DecodeHintType,String> hints =  new  HashMap<DecodeHintType, String>();
             hints.put(DecodeHintType.CHARACTER_SET,  "utf-8" );
                                                                                                                                 
             //基于二维码图片文件解码获得其结果
             Result result =  new  MultiFormatReader().decode(bitmap,hints);
                                                                                                                                 
             //从结果中获得原始文本
             return  result.getText();
         catch  (Exception e) {
             e.printStackTrace();
         }
         return  null ;
     }
                                                                                                                         
                                                                                                                         
                                                                                                                         
     public  static  void  main(String [] args){
                                                                                                                             
         //二维码Demo
         //生成二维码
         try {
             String qr_contents=  "Charles的二维码范例" ;
             int  qr_width =  200 ;
             int  qr_height=  200 ;
             generate2DBarCodeImage(qr_contents,qr_width,qr_height, "D:/Framework Study/BarCode/TwoDimensions/newQRcode.png" );
         } catch (Exception ex){
             System.err.print( "生成二维码出错" );
         }
                                                                                                                             
                                                                                                                             
         //解析二维码
         String qr_original = resolve2DBarCodeImage( "D:/Framework Study/BarCode/TwoDimensions/newQRcode.png" );
         System.out.println( "还原的信息为:" +qr_original);
                                                                                                                             
                                                                                                                             
     }
}



我们做实验,当运行生成二维码部分时候,它会在D:/Framework Study/BarCode/TwoDimensions/newQRCode.png生成一个二维码图片文件,大小格式都符合:

164448883.png

我们查看这个二维码图片文件,显然,它说的特征符合我们开始介绍的QR二维码的特征:

164543963.png


然后我们运行下面的解析过程,则控制台显示:

164628880.png

说明我们的代码是完全正确的.


我还用了我同事的手机扫描了我这里生成的二维码信息,它会显示 ”Charles的二维码范例“文本在手机上。


福利:

这里提供一个在线网站可以专门去定制二维码:

http://cli.im/





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1341190,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
存储 数据挖掘
[Halcon&识别] 二维码识别
[Halcon&识别] 二维码识别
84 0
|
9月前
微信公众号扫码条形码和二维码后用split函数按照条码类型进行截取处理的解决方案
微信公众号扫码条形码和二维码后用split函数按照条码类型进行截取处理的解决方案
49 0
|
10月前
|
存储 编解码 索引
OpenMV扫码识别
OpenMV扫码识别
127 1
|
边缘计算 并行计算 算法
Opencv+ZBar识别条形码、二维码
Opencv+ZBar识别条形码、二维码
606 0
Opencv+ZBar识别条形码、二维码
|
开发工具 计算机视觉
配置zbar识别二维码(转载)
原文地址:http://blog.csdn.net/dcrmg/article/details/52108258  二维码解码器Zbar+VS2012开发环境配置 Zbar条码解码器是一个开源的二维码(包括条形码)解码器,可以识别来至于视频流,图像文件、手持扫码器和视频设备(如摄像头)等二维码识别,支持EAN-13/UPC-A, UPC-E, EAN-8, Code 128, Code 39, QR Code(二维码)等常用编码方式的条形码/二维码。
2440 0
|
程序员 C# 图形学
C# 生成二维码,彩色二维码,带有Logo的二维码及普通条形码
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默。我眼中的程序员大多都不爱说话,默默承受着编程的巨大压力,除了技术上的交流外,他们不愿意也不擅长和别人交流,更不乐意任何人走进他们的内心!    废话少说,咱直接进入正题:    目前来说,比较流行的二维码生成方式有两种:一种是:QrCode.Net和谷歌的Zxing.Net,我个人比较倾向于使用ZXing.Net,今天本篇博客主要讲解Zxing.Net的使用。
1887 0
|
图形学
Unity3D 生成&识别二维码
Unity扫描识别二维码 用WebCamTexture 获得摄像头数据,并把他付给UI层的RawImage.这个用来展示摄像头拍摄的内容画面。 private void CreateWebcamTex(string deviceName){ mWebCamTexture = new WebCamTexture(deviceName,1280, 720); rawImage.
1636 0