Java生成二维码
本文是学习慕课网课程《Java生成二维码》(http://www.imooc.com/learn/531)的笔记。
一、二维码的分类
线性堆叠式二维码、矩阵式二维码、邮政码。
二、二维码的优缺点
优点:1. 高密度编码,信息容量大;2.编码范围广;3.容错能力强;4.译码可靠性高;5.可引入加密措施;6.成本低,易制作,持久耐用。
缺点:1.二维码技术成为手机病毒、钓鱼网站传播的新渠道;2.信息容易泄露。
三、三大国际标准
1.PDF417:不支持中文;
2.DM:专利未公开,需要支付专利费用;
3.QR Code:专利公开,支持中文。
其中,QR Code具有识读速度快、数据密度大、占用空间小的优势。
四、纠错能力
L级:约可纠错7%的数据码字
M级:约可纠错15%的数据码字
Q级:约可纠错25%的数据码字
H级:约可纠错30%的数据码字
五、ZXing生成/读取二维码
首先,下载ZXing源文件。下载地址:https://github.com/zxing/zxing/releases;
再次,创建一个Java项目。将ZXing源文件中的core/src/main/java/com和javase/src/main/java/com两个文件复制到项目中,编译成jar文件;
最后,在以后的开发中就可以使用该jar文件。
ZXing生成二维码的代码如下:
1 package com.aston.qrcode.zxing; 2 3 import java.io.File; 4 import java.io.OutputStream; 5 import java.io.OutputStreamWriter; 6 import java.nio.file.Path; 7 import java.util.HashMap; 8 9 import javax.sound.midi.Patch; 10 11 import com.google.zxing.BarcodeFormat; 12 import com.google.zxing.EncodeHintType; 13 import com.google.zxing.MultiFormatWriter; 14 import com.google.zxing.client.j2se.MatrixToImageWriter; 15 import com.google.zxing.common.BitMatrix; 16 import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; 17 18 //生成二维码 19 public class CreateQRCode { 20 public static void main(String[] args){ 21 final int width = 300; 22 final int height = 300; 23 final String format = "png"; 24 final String content = "我爱你,中国"; 25 26 //定义二维码的参数 27 HashMap hints = new HashMap(); 28 hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); 29 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); 30 hints.put(EncodeHintType.MARGIN, 2); 31 32 //生成二维码 33 try{ 34 //OutputStream stream = new OutputStreamWriter(); 35 BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints); 36 Path file = new File("F:/img.png").toPath(); 37 MatrixToImageWriter.writeToPath(bitMatrix, format, file); 38 //MatrixToImageWriter.writeToStream(bitMatrix, format, stream); 39 }catch(Exception e){ 40 41 } 42 43 } 44 45 }
ZXing读取二维码信息代码如下:
1 package com.aston.qrcode.zxing; 2 3 import java.awt.image.BufferedImage; 4 import java.io.File; 5 import java.util.HashMap; 6 7 import javax.imageio.ImageIO; 8 9 import com.google.zxing.BinaryBitmap; 10 import com.google.zxing.EncodeHintType; 11 import com.google.zxing.MultiFormatReader; 12 import com.google.zxing.Result; 13 import com.google.zxing.client.j2se.BufferedImageLuminanceSource; 14 import com.google.zxing.common.HybridBinarizer; 15 16 //读取二维码信息 17 public class ReadQRCode { 18 19 public static void main(String[] args) throws Exception { 20 MultiFormatReader formatReader = new MultiFormatReader(); 21 File file = new File("F:/img.png"); 22 23 BufferedImage image = ImageIO.read(file); 24 BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image))); 25 26 //定义二维码的参数 27 HashMap hints = new HashMap(); 28 hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); 29 30 Result result = formatReader.decode(binaryBitmap, hints); 31 32 System.out.println("二维码解析结果:" + result.toString()); 33 System.out.println("二维码的格式:" + result.getBarcodeFormat()); 34 System.out.println("二维码的文本内容:" + result.getText()); 35 } 36 37 }
六、QRCode生成/读取二维码
QRCode生成和读取二维码的jar是分开的,下载网址如下:
QRCode生成二维码网址:http://swetake.com/qrcode/index-e.html
QRCode读取二维码网址:https://osdn.jp/projects/qrcode
QRCode生成二维码代码如下:
1 package com.aston.qrcode.qrcode; 2 3 import java.awt.Color; 4 import java.awt.Graphics2D; 5 import java.awt.image.BufferedImage; 6 import java.io.File; 7 8 import javax.imageio.ImageIO; 9 10 import com.swetake.util.Qrcode; 11 12 public class CreateQRCode { 13 14 public static void main(String[] args) throws Exception { 15 Qrcode x=new Qrcode(); 16 x.setQrcodeErrorCorrect('M');//纠错等级 17 x.setQrcodeEncodeMode('B');//N 代表数据; A 代表a-A; B 代表其他字符 18 x.setQrcodeVersion(7);//版本 19 20 String qrData = "我爱你,中国"; 21 22 int width = 67 + 12*(7-1); 23 int height = 67 + 12*(7-1); 24 //int width = 300; 25 //int height = 300; 26 int pixoff = 2;//偏移量 27 28 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 29 30 Graphics2D gs = bufferedImage.createGraphics(); 31 gs.setBackground(Color.WHITE); 32 gs.setColor(Color.BLACK); 33 gs.clearRect(0, 0, width, height); 34 35 byte[] d =qrData.getBytes("utf-8"); 36 if (d.length>0 && d.length <120){ 37 boolean[][] s = x.calQrcode(d); 38 39 for (int i=0;i<s.length;i++){ 40 for (int j=0;j<s.length;j++){ 41 if (s[j][i]) { 42 gs.fillRect(j*3+pixoff,i*3+pixoff,3,3); 43 } 44 } 45 } 46 } 47 48 gs.dispose(); 49 bufferedImage.flush(); 50 51 ImageIO.write(bufferedImage, "png", new File("F:/qrcode.png")); 52 } 53 54 }
QRCode读取二维码信息代码如下:
1 package com.aston.qrcode.qrcode; 2 3 import java.awt.image.BufferedImage; 4 import java.io.File; 5 import java.io.IOException; 6 7 import javax.imageio.ImageIO; 8 9 import jp.sourceforge.qrcode.QRCodeDecoder; 10 11 public class ReadQRCode { 12 public static void main(String[] args) throws Exception { 13 File file = new File("F:/qrcode.png"); 14 15 BufferedImage bufferedImage = ImageIO.read(file); 16 17 QRCodeDecoder qrCodeDecoder = new QRCodeDecoder(); 18 19 String result = new String(qrCodeDecoder.decode(new MyQRCodeImage(bufferedImage)),"utf-8"); 20 21 System.out.println("二维码解析结果:" + result); 22 } 23 }
MyQRCodeImage.java代码如下:
1 package com.aston.qrcode.qrcode; 2 3 import java.awt.image.BufferedImage; 4 5 import jp.sourceforge.qrcode.data.QRCodeImage; 6 7 public class MyQRCodeImage implements QRCodeImage { 8 private BufferedImage bufferedImage; 9 10 public MyQRCodeImage(BufferedImage bufferedImage){ 11 this.bufferedImage = bufferedImage; 12 } 13 14 @Override 15 public int getHeight() { 16 // TODO Auto-generated method stub 17 return bufferedImage.getHeight(); 18 } 19 20 @Override 21 public int getPixel(int arg0, int arg1) { 22 // TODO Auto-generated method stub 23 return bufferedImage.getRGB(arg0, arg1); 24 } 25 26 @Override 27 public int getWidth() { 28 // TODO Auto-generated method stub 29 return bufferedImage.getWidth(); 30 } 31 32 }
七、声明
以上代码均出自慕课网教程,且经过本人验证可成功执行。转载时可以不注明本文网址,但请注明慕课网教程网址。