zoukankan      html  css  js  c++  java
  • 一个生成和解析二维码的类

    public class QRCodeUtil {

    /**
    * 生成二维码(QRCode)图片
    *
    * @param content
    * 存储内容
    * @param imgPath
    * 图片路径
    * @param imgType
    * 图片类型
    */
    public void encoderQRCode(String content, String imgPath, String imgType) {
    this.encoderQRCode(content, imgPath, imgType, 7); //为解决名字太长的时候无法生成二维码 先将size 7换为0
    // this.encoderQRCode(content, imgPath, imgType, 0);

    }

    /**
    * 生成二维码(QRCode)图片
    *
    * @param content
    * 存储内容
    * @param imgPath
    * 图片路径
    * @param imgType
    * 图片类型
    * @param size
    * 二维码尺寸
    */
    public void encoderQRCode(String content, String imgPath, String imgType,
    int size) {
    try {
    BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
    String filePath = imgPath.substring(0,imgPath.lastIndexOf(File.separator));
    File file = new File(filePath);
    if(!file.exists())
    file.mkdirs();
    File imgFile = new File(imgPath+"."+imgType);
    // 生成二维码QRCode图片
    ImageIO.write(bufImg, imgType, imgFile);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
    * 生成二维码(QRCode)图片的公共方法
    *
    * @param content
    * 存储内容
    * @param path
    * 存储路径
    * @param imgType
    * 图片类型
    * @param size
    * 二维码尺寸
    * @return
    */
    private BufferedImage qRCodeCommon(String content, String imgType, int size) {
    BufferedImage bufImg = null;
    try {
    Qrcode qrcodeHandler = new Qrcode();
    // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
    qrcodeHandler.setQrcodeErrorCorrect('M');
    qrcodeHandler.setQrcodeEncodeMode('B');
    // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
    qrcodeHandler.setQrcodeVersion(size);
    // 获得内容的字节数组,设置编码格式
    byte[] contentBytes = content.getBytes("utf-8");
    // 图片尺寸
    int imgSize = 67 + 12 * (size - 1);
    bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
    Graphics2D gs = bufImg.createGraphics();
    // 设置背景颜色
    gs.setBackground(Color.WHITE);
    gs.clearRect(0, 0, imgSize, imgSize);

    // 设定图像颜色> BLACK
    gs.setColor(Color.BLACK);
    // 设置偏移量,不设置可能导致解析出错
    int pixoff = 2;
    // 输出内容> 二维码
    if (contentBytes.length > 0 && contentBytes.length < 800) {
    boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
    for (int i = 0; i < codeOut.length; i++) {
    for (int j = 0; j < codeOut.length; j++) {
    if (codeOut[j][i]) {
    gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
    }
    }
    }
    } else {
    throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");
    }
    gs.dispose();
    bufImg.flush();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return bufImg;
    }

    /**
    * 解析二维码(QRCode)
    *
    * @param imgPath
    * 图片路径
    * @return
    */
    public String decoderQRCode(String imgPath) {
    // QRCode 二维码图片的文件
    File imageFile = new File(imgPath);
    BufferedImage bufImg = null;
    String content = null;
    try {
    bufImg = ImageIO.read(imageFile);
    QRCodeDecoder decoder = new QRCodeDecoder();
    content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
    } catch (IOException e) {
    System.out.println("Error: " + e.getMessage());
    e.printStackTrace();
    } catch (DecodingFailedException dfe) {
    System.out.println("Error: " + dfe.getMessage());
    dfe.printStackTrace();
    }
    return content;
    }

    public static void main(String[] args) {
    QRCodeUtil handler = new QRCodeUtil();
    // String decoderContent = handler.decoderQRCode("D:/memberCode/18702410260.jpg");150282890682103BAF9CBDD9F07EA85B
    // System.out.println(decoderContent);150282890682103BAF9CBDD9F07EA85B3D70351E85DD40E149496CFA7FC4433E82490712CFF43E07EF12CBF10A1E4E91
    // String content = "{"serverAddress":"mdm.idealbiz.com.cn","orgCode":"ideal","userName":"u3","password":""+Constants.USER_QRCODE_PRE + pwd+""}";
    // System.out.println(content.length());
    //handler.encoderQRCode("http://mdm.idealbiz.com.cn/client/itms-services://?action=download-manifest&amp;url=https://mdm.idealbiz.com.cn:8004/mdm/v1_1_7/iMDM.plist", "F:/"+File.separator+"u3", "png");
    handler.encoderQRCode("http://mdm.idealbiz.com.cn/client/iMDM_v1_1_15.apk", "F:/"+File.separator+"common", "png");
    }

    public static int getRnNumber(){
    return (int)((Math.random()*9+1)*100000);
    }
    }

    Qrcode:com.swetake.util.Qrcode

  • 相关阅读:
    JSF教程(8)——生命周期之Apply Request Values Phase
    使Gallery时设置居左显示
    Android---06---2中动画效果
    java之UDP(datagramsocket,datagramPacket)实例
    Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)
    固态硬盘(SSD) 和机 械硬盘(HDD) 优缺点比較
    使用单例时的三种单例写法
    POJ 2777 Count Color
    Linux下画原理图和PCB
    hdu3685(几何重心与凸包结合)
  • 原文地址:https://www.cnblogs.com/zhaoblog/p/5545065.html
Copyright © 2011-2022 走看看