zoukankan      html  css  js  c++  java
  • 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 }

      七、声明

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

  • 相关阅读:
    VC编程锦集-1
    VC窗口关闭调用顺序
    Windows消息WM_USER、WM_APP的区别
    Toolbar添加控件;创建多行toolbar;重新排列toolbar
    SQL模糊查询详解
    MySql格式化日期
    Apache PHP 服务环境配置
    kvm.install
    repo搭建
    apache故障处理
  • 原文地址:https://www.cnblogs.com/aston/p/7501895.html
Copyright © 2011-2022 走看看