Java 生成二维码
Posted 认真对待世界的小白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 生成二维码相关的知识,希望对你有一定的参考价值。
二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的图形。
二维条码也有许多不同的码制,码制的编码原理而言,通常分为三种类型
- 线性堆叠式二维码
- 矩阵式二维码
- 邮政码
线性堆叠式二维码
编码原理:建立在一维条码基础之上,按需要堆积成两行或多行。
矩阵式二维码
在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”
邮政码
邮政码通过不同长度的条进行编码,主要用于邮件编码,如:POSTNET、BPO 4-STATE。
二维码的优缺点
优点
- 高密度编码,信息容量大
- 编码范围广
- 容错能力强
- 译码可靠性高
- 可引入加密措施
- 成本低,易制作,持久耐用
缺点
- 二维码技术成为手机病毒、钓鱼网站传播的新渠道
- 信息泄露
目前流行的三大国际标准:
- PDF417:不支持中文
- DM:专利未公开,需支付专利费用
- QR code:专利公开,支持中文
QR code 比其他二维码相比,具有识读速度快、数据密度大、占用空间小的优势。
QR code 是由日本Denso公司于1994年研制的一种矩阵二维码符号码,全称是 Quick Response Code。
纠错能力
- L级:约可纠错7%的数据码字
- M级:约可纠错15%的数据码字
- Q级:约可纠错25%的数据码字
- H级:约可纠错30%的数据码字
JSP生成二维码方法
- 借助第三方jar,如zxing和qrcodejar
- javascript,如jquery.qrcode.js
使用zxing生成二维码
GitHub地址,猛戳:https://github.com/zxing/zxing
API文档,猛戳:https://zxing.github.io/zxing/apidocs/index.html
介绍文档,猛戳:https://zxing.github.io/zxing/
第一步:引入jar包
可以通过下载源码自己编译生成jar包,也可以通过maven依赖
<dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.3</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.3</version> </dependency>
第二步:生成二维码的代码
package com.jwen.imooc.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; public class CreateQRCode { public static void main(String[] args) { int width = 300; int height = 300; String format = "png"; String contents = "www.baidu.com"; // 定义二维码的参数 HashMap hints = new HashMap(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.M); hints.put(EncodeHintType.MARGIN,2); try { BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints); Path path = new File("C:/Users/jwen/Desktop/img.png").toPath(); MatrixToImageWriter.writeToPath(bitMatrix, format, path); }catch(Exception e) { e.printStackTrace(); } } }
第三步:读取二维码的代码
public class ReadQRCode { public static void main(String[] args) { try { MultiFormatReader formatReader = new MultiFormatReader(); File file = new File("C:/Users/jwen/Desktop/img.png"); BufferedImage 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 (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
使用qrcode生成二维码
生成:http://www.swetake.com/qrcode/index-e.html
读取:https://osdn.jp/projects/qrcode/
第一步:下载引入jar包
第二步:生成二维码的代码
package com.jwen.imooc.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; public class CreateQRCode { public static void main(String[] args) throws Exception { int version = 7; Qrcode x = new Qrcode(); x.setQrcodeErrorCorrect(\'M\');// 纠错等级 x.setQrcodeEncodeMode(\'B\');// N代表数字,A代表a-Z,B代表其他字符 x.setQrcodeVersion(version);// 版本 String qrDate = "www.baidu.com"; int width = 67 + 12 + (version - 1); int height = 67 + 12 + (version - 1); File file = new File("C:/Users/jwen/Desktop/img2.png"); BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D gs = bufferedImage.createGraphics(); gs.setBackground(Color.WHITE); gs.setColor(Color.BLACK); gs.clearRect(0, 0, width, height); int pixoff = 2;// 偏移量 byte[] d = qrDate.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", file); } }
第三步:读取二维码的代码
package com.jwen.imooc.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; public class CreateQRCode { public static void main(String[] args) throws Exception { int version = 7; Qrcode x = new Qrcode(); x.setQrcodeErrorCorrect(\'M\');// 纠错等级 x.setQrcodeEncodeMode(\'B\');// N代表数字,A代表a-Z,B代表其他字符 x.setQrcodeVersion(version);// 版本 String qrDate = "www.baidu.com"; int width = 67 + 12 + (version - 1); int height = 67 + 12 + (version - 1); File file = new File("C:/Users/jwen/Desktop/img2.png"); BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D gs = bufferedImage.createGraphics(); gs.setBackground(Color.WHITE); gs.setColor(Color.BLACK); gs.clearRect(0, 0, width, height); int pixoff = 2;// 偏移量 byte[] d = qrDate.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", file); } }
package com.jwen.imooc.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 bufferedImage.getHeight(); } @Override public int getPixel(int arg0, int arg1) { return bufferedImage.getRGB(arg0, arg1); } @Override public int getWidth() { return bufferedImage.getWidth(); } }
注意:此方式本人解析时报错,尚未解决:Invalid number of Finder Pattern detected
前端生成二维码的方式有 jquery.qrcode,此处不赘述
以上是关于Java 生成二维码的主要内容,如果未能解决你的问题,请参考以下文章