时间:2017年06月23日星期五
说明:本文部份内容均来自慕课网。@慕课网:http://www.imooc.com
教学示例源码:无
我的学习源码:https://github.com/zccodere/s...javascript
二维码示意图html
使用场景java
目录jquery
二维码概念 二维码发展历史 二维码分类 二维码优缺点 QR Code 示例讲解
二维码概念git
二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按必定规律在平面(二位方向上)分布的黑白相间的图形记录数据符号信息的图形。
发展历史github
一维条码ide
一维条码是由一组粗细不一样、黑白(或彩色)相间的条、空及其相应的字符(数字字母)组成的标记,即传统条码。
一维条码示意图学习
二维条码网站
二维条码是用某种特定的几何图形按必定规律在平面(二维方向)上分布的条、空相间的图形来记录数据符号信息。
二维条码示意图ui
二维条码也有许多不一样的码制,就码制的编码原理而言,一般分为三种类型:
1.线性堆叠式二维码 2.矩阵式二维码 3.邮政码
线性堆叠式二维码
编码原理:创建在一维条码基础之上,按须要堆积成两行或多行。
线性堆叠式二维码示意图
矩阵式二维码
在一个矩形空间经过黑、白像素在矩阵中的不一样分布进行编码。 在矩阵相应元素位置上,用点(方点、圆点或其余形状)的出现表示二进制“1”,点的不出现表示二进制的“0”
矩阵式二维码示意图
邮政码
邮政码经过不一样长度的条进行编码,主要用于邮件编码,如:POSTNET、BPO 4-STATE
优势
高密度编码,信息容量大 (多达1850个大写字母或2710数字或1108个字节或500个汉字) 编码范围广 能够把图片、文字、指纹,能够数字化的信息均可以进行编码,用条码显示出来 容错能力强 译码可靠性高 可引入加密措施 成本低、易制做、持久耐用
缺点
二维码技术成为手机病毒、钓鱼网站传播的新渠道 信息泄露
目前流行的三大国际标准:
PDF417:不支持中文 DM:专利未公开,需支付专利费用 QR Code:专利公开,支持中文
QR Code比其余二维码相比具备的优点
识读速度快 数据密度大 占用空间小
QR Code是由日本Denso公司于1994年研制的一种矩阵二维码符号吗,全称是Quick Response Code
示意图
JSP生成二维码的方法
借助第三方jar,如zxing和qrcodejar Javascript,如jquery.qrcode.js
zxing地址
https://github.com/zxing/zxing
Maven坐标
<!-- https://mvnrepository.com/artifact/com.google.zxing/core --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.google.zxing/javase --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0</version> </dependency>
代码演示:
package com.myimooc.zxing; import java.io.File; import java.nio.file.Path; import java.util.HashMap; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * 生成 二维码 * @author ZhangCheng on 2017-06-23 */ public class CreateQRCode { public static void main(String[] args) { // 定义图片的宽度和高度 int width = 300; int height = 300; // 定义图片的格式 String format = "png"; // 定义二维码的内容 String contents = "www.imooc.com"; Path file = new File("D:/img.png").toPath(); // 定义二维码的参数 HashMap<EncodeHintType,Object> hints = new HashMap<EncodeHintType,Object>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 设置字符编码 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);// 设置容错等级 hints.put(EncodeHintType.MARGIN, 2);// 设置边距(默认值5) // 生成二维码 try { BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height,hints); MatrixToImageWriter.writeToPath(bitMatrix, format, file); } catch (Exception e) { e.printStackTrace(); } } }
代码演示:
package com.myimooc.zxing; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import javax.imageio.ImageIO; import com.google.zxing.BinaryBitmap; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatReader; import com.google.zxing.NotFoundException; import com.google.zxing.Result; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.common.HybridBinarizer; /** * 读取 二维码 * @author ZhangCheng on 2017-06-23 */ public class ReadQRCode { @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) { MultiFormatReader formatReader = new MultiFormatReader(); // 定义二维码文件路径 File file = new File("D:/img.png"); // 读取图片文件识别为一个图片流 BufferedImage image; try { image = ImageIO.read(file); BinaryBitmap binaryBitmap = new BinaryBitmap( new HybridBinarizer( new BufferedImageLuminanceSource(image))); // 定义二维码的参数 HashMap hints = new HashMap(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 设置字符编码 // 解析二维码 Result result = formatReader.decode(binaryBitmap,hints); System.out.println("解析结果:"+result.toString()); System.out.println("格式类型:"+result.getBarcodeFormat()); System.out.println("文本内容:"+result.getText()); } catch (IOException e) { e.printStackTrace(); } catch (NotFoundException e) { e.printStackTrace(); } } }
QRCode
生成:http://www.swetake.com/qrcode/index-e.html 读取:https://osdn.jp/projects/qrcode/
代码演示
1.生成二维码
package com.myimooc.qrcode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.swetake.util.Qrcode; /** * 生成 二维码 经过 Qrcode * * @author ZhangCheng on 2017-06-23 */ public class CreateQRCode { public static void main(String[] args) throws Exception { Qrcode x = new Qrcode(); // 二维码显示的内容 String qrData = "www.imooc.com"; int version = 7; int width = 67 + 12 * (version - 1); int height = 67 + 12 * (version - 1); // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰 x.setQrcodeErrorCorrect('M');// 纠错等级 x.setQrcodeEncodeMode('B');// N表明数字,A表明z-Z,B表明其余字符 // 设置设置版本号,取值范围1-40,值越大尺寸越大,可存储的信息越大 x.setQrcodeVersion(version); BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); Graphics2D gs = bufferedImage.createGraphics(); // 设置属性 gs.setBackground(Color.WHITE); gs.setColor(Color.BLACK); gs.clearRect(0, 0, width, height); // 偏移量 int pixoff = 2; byte[] d = qrData.getBytes("gb2312"); if (d.length > 0 && d.length < 120) { boolean[][] s = x.calQrcode(d); for (int i = 0; i < s.length; i++) { for (int j = 0; j < s.length; j++) { if (s[j][i]) { gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); } } } } gs.dispose(); bufferedImage.flush(); ImageIO.write(bufferedImage, "png", new File("D:/qrcode.png")); } }
2.读取二维码时,需实现 QRCodeImage 接口
package com.myimooc.qrcode; import java.awt.image.BufferedImage; import jp.sourceforge.qrcode.data.QRCodeImage; /** * 读取 二维码 时,需实现 QRCodeImage 接口 * * @author ZhangCheng on 2017-06-23 */ public class MyQRCodeImage implements QRCodeImage{ BufferedImage bufferedImage; public MyQRCodeImage(BufferedImage bufferedImage){ this.bufferedImage = bufferedImage; } @Override public int getHeight() { return bufferedImage.getHeight(); } @Override public int getPixel(int arg0, int arg1) { return bufferedImage.getRGB(arg0, arg1); } @Override public int getWidth() { return bufferedImage.getWidth(); } }
3.读取二维码
package com.myimooc.qrcode; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import jp.sourceforge.qrcode.QRCodeDecoder; /** * 读取 二维码 经过 Qrcode * * @author ZhangCheng on 2017-06-23 */ public class ReadQRCode { public static void main(String[] args) throws Exception { File file = new File("D:/qrcode.png"); BufferedImage bufferedImage = ImageIO.read(file); QRCodeDecoder codeDecoder = new QRCodeDecoder(); String result = new String(codeDecoder.decode(new MyQRCodeImage(bufferedImage)),"gb2312"); System.out.println(result); } }
jquery-qrcode
地址:https://github.com/jeromeetienne/jquery-qrcode
代码演示:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>生成二维码</title> <script type="text/javascript" src="static/js/jquery.min.js"></script> <script type="text/javascript" src="static/js/jquery.qrcode.min.js"></script> </head> <body> 生成的二维码以下:<br> <div id="qrcode"></div> <script type="text/javascript"> $('#qrcode').qrcode("www.imooc.com"); </script> </body> </html>
效果以下:
二维码还能够这样
为何咱们的二维码扫描出来是文本而不是连接?
如何实现二维码扫描安装手机软件?以慕课网为例
如何实现二维码扫描名片?
VCard是标准通讯薄基本格式
VCard规范
代码实现