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 }

  七、声明

    以上代码均出自慕课网教程,且经过本人验证可成功执行。转载时可以不注明本文网址,但请注明慕课网教程网址。

 

posted @ 2017-09-10 19:13  aston  阅读(30137)  评论(3编辑  收藏  举报