java创建QRCode二维码的三种方式
2017-07-20 11:06
351 查看
自己在网上看视频学习了下如何使用java创建二维码,感觉还是挺有趣的,有小心思的还可以把秘密存入二维码中噢
视频源网址:http://www.imooc.com/learn/531
点击下载jar包
线性堆叠式二维码:建立在一维条码基础上,按需要堆积成两行或多行。与一维码很类似。
矩阵式二维码:(最常用)在一个矩阵空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其它形状)的出现表示二进制“1”,点的不出现表示二进制的“0”。QR CODE
邮政码:通过不同长度的条进行编码,主要用于邮件编码。
二维码详解:
![](https://img-blog.csdn.net/20170720112653675?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzgwOTY2MDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
DM:专利未公开,需支付专利费
QRCode:专利公开,支持中文
因为QRCode支持中文,免费。读取速度快,数据密度大,占用空间小的优势。本次只介绍怎么生成QRCode二维码
②JavaScript,如jquery.qrcode.js
2.QRCode
QRCodeImage实现类:
3.jQuery方式:最简单,但支持功能太少,不支持中文
视频源网址:http://www.imooc.com/learn/531
点击下载jar包
二维码的类别
二维码依据码制的编码原理,通常分为三种:
线性堆叠式二维码、矩阵式二维码、邮政码。
线性堆叠式二维码:建立在一维条码基础上,按需要堆积成两行或多行。与一维码很类似。矩阵式二维码:(最常用)在一个矩阵空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其它形状)的出现表示二进制“1”,点的不出现表示二进制的“0”。QR CODE
邮政码:通过不同长度的条进行编码,主要用于邮件编码。
二维码详解:
优缺点
二维码优点:
(1)高密度编码,信息容量大;
(2)编码范围广;
(3)容错能力强;
(4)编码可靠性高;
(5)可引入加密措施;
(6)成本低,易制作,持久耐用。
二维码缺点:
(1)二维码技术成为手机病毒、钓鱼网站传播的新渠道;
(2)信息泄露。
三大国际标准
PDF417:不支持中文DM:专利未公开,需支付专利费
QRCode:专利公开,支持中文
因为QRCode支持中文,免费。读取速度快,数据密度大,占用空间小的优势。本次只介绍怎么生成QRCode二维码
纠错等级:
L级:7%
M级:15%
Q级:25%
H级:30%
JSP生成二维码的方法: --jar包在页头
①借助第三方jar,如zxing和qrcodejar②JavaScript,如jquery.qrcode.js
1.zxing方式
/** * 使用zxing创建QrCode格式二维码 * @param content 二维码的内容 * @param fullPath 完整的资源存储路径 */ public static void createQrCode(String content, String fullPath) { //定义宽高和图片格式和二维码内容 int width = 300; int height = 300; String format = "png"; /*String content = "";*/ //定义文件路径 /*Path filePath = new File("E:/JavaExcelTest/QrCode02.png").toPath();*/ Path filePath = new File(fullPath).toPath(); //定义二维码参数:编码格式 HashMap config = new HashMap(); config.put(EncodeHintType.CHARACTER_SET, "UTF-8"); //二维码的纠错等级:L,M,Q,H.从低到高,纠错等级越高,所存储的数据就越少 config.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); //二维码的空白间隔值,默认为5 config.put(EncodeHintType.MARGIN, 2); MultiFormatWriter mfw = new MultiFormatWriter(); try { //BarcodeFormat.QR_CODE是一种二维码的格式 BitMatrix bm = mfw.encode(content, BarcodeFormat.QR_CODE, width, height, config); //写入资源 MatrixToImageWriter.writeToPath(bm, format, filePath); } catch (WriterException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("写入完毕!"); } /** * 使用zxings解析QrCode格式二维码 * @param fullPath 完整的资源存储路劲 */ public static void readQrCode(String fullPath) { try { MultiFormatReader multiFormatReader = new MultiFormatReader(); File file = new File(fullPath); //读取资源转为图片 BufferedImage image = ImageIO.read(file); BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer( new BufferedImageLuminanceSource(image))); //解析为result对象 Result result = multiFormatReader.decode(binaryBitmap); System.out.println("二维码数据: " + result.toString()); System.out.println("二维码编码格式: " + result.getBarcodeFormat()); System.out.println("二维码内容: " + result.getText()); } catch (NotFoundException e) { System.out.println("文件未找到!"); } catch (IOException e) { e.printStackTrace(); } }
2.QRCode
/** * 通过QRCode创建QrCode * @param content 二维码的文本内容 * @param fullPath 二维码的存储路径 */ public static void createQrCode(String content, String fullPath) { Qrcode qrCode = new Qrcode(); qrCode.setQrcodeErrorCorrect('M');//纠错等级 qrCode.setQrcodeVersion('7');//版本号1-40 qrCode.setQrcodeEncodeMode('B');//'N'是数字,'A'是a-Z,'B'是其他字符 //宽高公式:width=67+12*(版本号-1) int width = 67 + 12 * (7 - 1); int height = 67 + 12 * (7 - 1); BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D grap = bufferedImage.createGraphics(); //设置背景 grap.setBackground(Color.white); //设置画笔颜色 grap.setColor(Color.black); //清除画板 grap.clearRect(0, 0, width, height); //偏移量,防止解析发生异常 int pixoff = 2; try { //字节转换 byte[] contentByte = content.getBytes("UTF-8"); if (contentByte.length > 0 && contentByte.length < 120) { boolean[][] s = qrCode.calQrcode(contentByte); for (int i = 0; i < s.length; i++) { for (int j = 0; j < s.length; j++) { if (s[j][i]) { grap.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); } } } } grap.dispose(); bufferedImage.flush(); ImageIO.write(bufferedImage, "png", new File(fullPath)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("写入成功"); } /** * 通过QRCode解析QRCode * @param fullPath 二维码的存储路径 */ public static void readQrCode(String fullPath) { File file = new File(fullPath); try { BufferedImage bufferedImage = ImageIO.read(file); //创建QRCode解析实例 QRCodeDecoder qrCode = new QRCodeDecoder(); /* * 解析 * qrCode.decode(QrCodeImage qrCodeImage) * qrCodeImage是一个接口,无法实例化,需自定义类并实现QRCodeImage接口 */ String result = new String(qrCode.decode(new MyQrCodeImage(bufferedImage)), "UTF-8"); System.out.println(result); } catch (IOException e) { e.printStackTrace(); } }
QRCodeImage实现类:
package com.qrCode; import java.awt.image.BufferedImage; import jp.sourceforge.qrcode.data.QRCodeImage; public class MyQrCodeImage implements QRCodeImage { BufferedImage bufferedImage; public MyQrCodeImage(BufferedImage bufferedImage) { this.bufferedImage = bufferedImage; } @Override public int getHeight() { return this.bufferedImage.getHeight(); } //获取像素 @Override public int getPixel(int x, int y) { return this.bufferedImage.getRGB(x, y); } @Override public int getWidth() { return this.bufferedImage.getWidth(); } }
3.jQuery方式:最简单,但支持功能太少,不支持中文
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="com.entity.User" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Login</title> <script type="text/javascript" src="js/jquery.min.js"></script> <script type="text/javascript" src="js/jquery.qrcode.min.js"></script> <style type="text/css"> body{ background-color: #fff; } .main{ width:500px; height:200px; margin: auto auto; text-align: center; } </style> </head> <body> <div class="qrcode"></div> </body> <script type="text/javascript"> $(function(){ $(".qrcode").qrcode("阿拉蕾 "); }) </script> </html>
相关文章推荐
- java生成二维码的三种方式zxing、qrcode以及jqueryqrcode
- 三种方式实现二维码(java)
- java创建线程的三种方式及其对照
- java创建线程的三种方式
- 0036 Java学习笔记-多线程-创建线程的三种方式
- Java用QRCode的方式生成二维码
- Java创建一个多线程的三种方式
- java创建线程的三种方式及其对比
- 三种方式实现二维码(java)
- java创建线程的三种方式及其对比
- java创建启动多线程的三种方式
- java创建线程的三种方式及其对比
- QRCode-使用Javascript方式创建二维码
- java 创建数组的三种方式及区别
- Java创建线程的三种方式及其对比
- Java多线程之创建线程的三种方式比较
- 并发编程学习总结(一) :java 创建线程的三种方式的优缺点和实例
- Java:创建Class对象的三种方式/
- 三种Java创建线程的方式(Callable,FutureTask)
- java创建线程的三种方式