1 二维码概念
1.1 二维码定义
二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的图形。
1.2 一维码与二维码
一维条码(条形码)是有一组粗细不同、黑白(或彩色)相间的条、空及其相应的字符(数字字母)组成的标记,即传统条码。
二维条码使用某种特定的几何图形按一定规律在平面(二维方向)上分布的条、空相间的图形来记录数据符号信息。
1.3 二维码分类
二维码就码制的编码原理而言,通常分为三种类型:
- 线性堆叠式二维码
- 矩阵式二维码
- 邮政码
1.3.1 线性堆叠式二维码
编码原理:
- 建立在一维条码基础之上,按需要堆积成两行或多行。
1.3.2 矩阵式二维码
编码原理:
- 在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。
- 在矩阵相应元素位置上,用点(方点、圆点或其它形状)的出现表示二进制“1”,点的不出现表示二进制的“0”。
1.3.3 邮政码
编码原理:
- 邮政码通过不同长度的条进行编码,主要用于邮件编码,如POSTNET、BPO 4-STATE。
1.4 二维码优缺点
1.4.1 优点
- 高密度编码,信息容量大。
- 编码范围广。
- 容错能力强。
- 译码可靠性高。
- 可引入加密措施。
- 成本低,已制作,持久耐用。
1.4.2 缺点
- 二维码技术成为手机病毒、钓鱼网站传播的新渠道。
- 信息泄露。
2 DR Code
2.1 编码标准
目前流行的三大国际标准:
- PDF417:不支持中文。
- DM:专利未公开,需支付专利费用。
- DQ Code(Quick Response Code):专利公开,支持中文(与其他二维码相比,具有识读速度快、数据密度大、占用空间小的优势)。
2.2 DQ Code纠错能力
- L级:越可纠错7%的数据码字。
- M级:越可纠错15%的数据码字。
- Q级:越可纠错25%的数据码字。
- H级:越可纠错30%的数据码字。
2.3 JSP生成二维码的方法
- 借助第三方jar,如zxing和qrcodejar。
- Javascript,如jquery.qrcode.js。
- 关于二维码的更多理论知识,请点这里。
3 实例操作
3.1 使用zxing生成二维码
准备:在项目中添加zxing3.2.1.jar外部库。
程序代码:
1 import java.io.File; 2 import java.nio.file.Path; 3 import java.util.HashMap; 4 import com.google.zxing.BarcodeFormat; 5 import com.google.zxing.EncodeHintType; 6 import com.google.zxing.MultiFormatWriter; 7 import com.google.zxing.client.j2se.MatrixToImageWriter; 8 import com.google.zxing.common.BitMatrix; 9 import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; 10 11 //利用zxing生成二维码 12 public class Zxing { 13 public static void main(String[] args) { 14 int width = 600;//二维码宽度 15 int height = 600;//二维码高度 16 String format = "png";//生成的图片格式 17 String content = "祁俊辉";//生成的内容//这里可以使用“http://www.baidu.com”实现跳转 18 19 //定义二维码的参数 20 HashMap hints = new HashMap(); 21 hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//编码方式 22 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);//纠错等级 23 hints.put(EncodeHintType.MARGIN, 2);//边距 24 25 //生成二维码 26 try { 27 BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints); 28 Path file = new File("E:/二维码.png").toPath();//路径选择 29 MatrixToImageWriter.writeToPath(bitMatrix, format, file);//生成到一个路径下 30 System.out.println("生成成功!"); 31 } catch (Exception e) { 32 e.printStackTrace(); 33 System.out.println("生成失败!"); 34 } 35 } 36 }
生成结果:
3.2 使用zxing解析二维码
程序代码:
1 import java.awt.image.BufferedImage; 2 import java.io.File; 3 import java.io.IOException; 4 import java.util.HashMap; 5 import javax.imageio.ImageIO; 6 import com.google.zxing.BinaryBitmap; 7 import com.google.zxing.EncodeHintType; 8 import com.google.zxing.MultiFormatReader; 9 import com.google.zxing.NotFoundException; 10 import com.google.zxing.Result; 11 import com.google.zxing.client.j2se.BufferedImageLuminanceSource; 12 import com.google.zxing.common.HybridBinarizer; 13 14 15 public class Zxing_JX { 16 public static void main(String[] args) { 17 try { 18 MultiFormatReader formatReader = new MultiFormatReader(); 19 File file = new File("E:/二维码.png"); 20 21 BufferedImage image = ImageIO.read(file); 22 23 BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image))); 24 25 //定义二维码的参数 26 HashMap hints = new HashMap(); 27 hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//编码方式 28 29 Result result = formatReader.decode(binaryBitmap, hints); 30 31 System.out.println("解析结果:"+result.toString()); 32 System.out.println("二维码格式类型:"+result.getBarcodeFormat()); 33 System.out.println("二维码文本内容:"+result.getText()); 34 35 } catch (NotFoundException e) { 36 e.printStackTrace(); 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } 40 } 41 }
运行结果: