zoukankan      html  css  js  c++  java
  • Java生成与解析二维码

    1、下载支持二维码的jar包qrcode.jar和qrcode_swetake.jar,

    其中qrcode_swetake.jar用于生成二维码,rcode.jar用于解析二维码,jar包下载地址(免积分):http://download.csdn.net/detail/bakehe/9548373

    2、创建J2SEImageGucas实现类,用于实现二维码图像接口QRCodeImage

     1 package org.sasc.core.twobarcode;
     2 
     3 import java.awt.image.BufferedImage;
     4 
     5 import jp.sourceforge.qrcode.data.QRCodeImage;
     6 
     7 public class J2SEImageGucas implements QRCodeImage {
     8     BufferedImage image;
     9 
    10     public J2SEImageGucas(BufferedImage image) {
    11         this.image = image;
    12     }
    13 
    14     public int getWidth() {
    15         return image.getWidth();
    16     }
    17 
    18     public int getHeight() {
    19         return image.getHeight();
    20     }
    21 
    22     public int getPixel(int x, int y) {
    23         return image.getRGB(x, y);
    24     }
    25 }

    3、编写生成二维码的方法encode和解析二维码的方法decode

      1 package org.sasc.core.twobarcode;
      2 
      3 import java.awt.Color;
      4 import java.awt.Graphics2D;
      5 import java.awt.image.BufferedImage;
      6 import java.io.File;
      7 import java.io.IOException;
      8 
      9 import javax.imageio.ImageIO;
     10 
     11 import org.apache.log4j.Logger;
     12 
     13 import com.swetake.util.Qrcode;
     14 
     15 import jp.sourceforge.qrcode.QRCodeDecoder;
     16 
     17 public class CreateQRCode {
     18     private static final Logger log = Logger.getLogger(CreateQRCode.class);
     19 
     20     /**
     21      * 生成二维码
     22      * 
     23      * @param srcValue 二维码内容
     24      * @param qrcodePicfilePath 生成路径及二维码图片名称
     25      * @return
     26      * @author muxiaoyou
     27      */
     28     private static boolean encode(String srcValue, String qrcodePicfilePath) {
     29         int MAX_DATA_LENGTH = 200;
     30         byte[] d = srcValue.getBytes();
     31         int dataLength = d.length;
     32         int imageWidth = 139;//宽度为139像素
     33         int imageHeight = imageWidth;//长度也为139像素,即此二维码为139*139像素
     34         BufferedImage bi = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
     35 
     36         Graphics2D g = bi.createGraphics();
     37         g.setBackground(Color.WHITE);
     38         g.clearRect(0, 0, imageWidth, imageHeight);
     39         g.setColor(Color.BLACK);
     40 
     41         if (dataLength > 0 && dataLength <= MAX_DATA_LENGTH) {
     42             //QR码的最大容量取决于选择的版本、纠错级别和编码模式(Mode:数字、字符、多字节字符等)
     43             Qrcode qrcode = new Qrcode();
     44             qrcode.setQrcodeErrorCorrect('M');//设置容错率为M
     45             qrcode.setQrcodeEncodeMode('B');//设置二维码加密模式为B
     46             qrcode.setQrcodeVersion(7);//设置二维码模式为7,取值范围为1到40,值越大所能包含的字符信息量越大
     47             boolean[][] b = qrcode.calQrcode(d);
     48             int qrcodeDataLen = b.length;
     49             for (int i = 0; i < qrcodeDataLen; i++) {
     50                 for (int j = 0; j < qrcodeDataLen; j++) {
     51                     if (b[j][i]) {
     52                         g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
     53                     }
     54                 }
     55             }
     56             log.info("二维码生成完成!!");
     57         } else {
     58             log.info(dataLength + "大于" + MAX_DATA_LENGTH);
     59             return false;
     60         }
     61         g.dispose();
     62         bi.flush();
     63         
     64         File f = new File(qrcodePicfilePath);
     65         if(!f.exists()){
     66             f.mkdirs();
     67         }
     68         String suffix = f.getName().substring(f.getName().indexOf(".") + 1, f.getName().length());
     69         try {
     70             ImageIO.write(bi, suffix, f);
     71             log.info("二维码输出成功!!");
     72         } catch (IOException ioe) {
     73             log.info("二维码生成失败" + ioe.getMessage());
     74             return false;
     75         }
     76         return true;
     77     }
     78     
     79     /**
     80      * 解析二维码
     81      * @param qrcodePicfilePath 二维码图片路径
     82      * @return
     83      * @author muxiaoyou
     84      */
     85     private static String decode(String qrcodePicfilePath) {
     86         log.info("开始解析二维码!!");
     87         /* 读取二维码图像数据 */
     88         File imageFile = new File(qrcodePicfilePath);
     89         BufferedImage image = null;
     90         try {
     91             image = ImageIO.read(imageFile);
     92         } catch (IOException e) {
     93             log.info("读取二维码图片失败: " + e.getMessage());
     94             return null;
     95         }
     96         /* 解析二维码 */
     97         QRCodeDecoder decoder = new QRCodeDecoder();
     98         String decodedData = new String(decoder.decode(new J2SEImageGucas(image)));
     99         log.info("解析内容如下:" + decodedData);
    100         return decodedData;
    101     }
    102     
    103     /**
    104      * 程序入口
    105      */
    106     public static void main(String[] args) {
    107         String data = "文档编号:Document-967-9301;文档名称:普通文档";
    108         /**
    109          * 生成二维码
    110          */
    111         CreateQRCode.encode(data, "D:/twoBarCodeImagessss/文档Document.JPG");
    112         /**
    113          * 解析二维码
    114          */
    115         CreateQRCode.decode("D:/twoBarCodeImagessss/文档Document.JPG");
    116     }
    117 
    118 }
  • 相关阅读:
    【Express系列】第3篇——接入mysql
    【Express系列】第2篇——主程序的改造
    【Express系列】第1篇——项目创建
    AngularJS内置指令
    node服务端搭建学习笔记
    生成ssh key
    webstorm的常用操作
    VSCode 常用插件
    php集成包
    composer安装特别慢的解决方案
  • 原文地址:https://www.cnblogs.com/cnjavahome/p/6018583.html
Copyright © 2011-2022 走看看