开发者社区> 余二五> 正文

条形码研究-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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
9412 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
12998 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20072 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
33079 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18362 0
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
34869 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
24946 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
11788 0
+关注
20381
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载