• java代码生成二维码以及解析二维码


      1 package com.test;
      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 jp.sourceforge.qrcode.QRCodeDecoder;
     12 import jp.sourceforge.qrcode.exception.DecodingFailedException;
     13 
     14 import com.swetake.util.Qrcode;
     15 
     16 public class ErWeiMa {
     17 public static void main(String[] args) {
     18     qRCodeCommon("你好","jpg" , 7);
     19     System.out.println(decoderQRCode("d://ERWEIMA//test.jpg"));
     20 }
     21 /**
     22  * 生成二维码
     23  * @param content 存储的数据
     24  * @param imgType 图片类型
     25  * @param version 版本
     26  */
     27 private static void qRCodeCommon(String content, String imgType, int version) {  
     28     BufferedImage bufImg = null;  
     29     try {  
     30         Qrcode qrcodeHandler = new Qrcode();  
     31         // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小  
     32         qrcodeHandler.setQrcodeErrorCorrect('M');
     33         //设置编码模式 N 数字 ,A英文 ,B二进制
     34         qrcodeHandler.setQrcodeEncodeMode('B');  
     35         // 设置设置二维码版本,取值范围1-40,值越大版本越大,可存储的信息越大  
     36         //注意:设置太高生成的图片有可能扫不出来
     37         //1-40 共40个版本
     38         //1       21x21模块
     39         //40     177x177模块
     40         //每增加一个版本每边增加4个模块 ,如: 版本2 为25x25模块
     41         qrcodeHandler.setQrcodeVersion(version);  
     42         // 获得内容的字节数组,设置编码格式  
     43         byte[] contentBytes = content.getBytes("utf-8");  
     44         // 图片尺寸  
     45         //注意:尺寸不易过大,也不易过小
     46         int imgSize = 150;  
     47         bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);  
     48         Graphics2D gs = bufImg.createGraphics();  
     49         // 设置背景颜色  
     50         gs.setBackground(Color.WHITE);  
     51         gs.clearRect(0, 0, imgSize, imgSize);  
     52 
     53         // 设定图像颜色> BLACK  
     54         gs.setColor(Color.BLACK);  
     55         // 设置偏移量,不设置可能导致解析出错  
     56         int pixoff = 2;  
     57         // 输出内容> 二维码  
     58         if (contentBytes.length > 0 && contentBytes.length < 800) {  
     59             boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);  
     60             for (int i = 0; i < codeOut.length; i++) {  
     61                 for (int j = 0; j < codeOut.length; j++) {  
     62                     if (codeOut[j][i]) {  
     63                         gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);  
     64                     }  
     65                 }  
     66             }  
     67         } else {  
     68             throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");  
     69         }  
     70         gs.dispose();  
     71         bufImg.flush();
     72         
     73         File imgFile = new File("d://ERWEIMA//test.jpg");
     74         ImageIO.write(bufImg, imgType, imgFile);
     75     } catch (Exception e) {  
     76         e.printStackTrace();  
     77     }  
     78 }
     79 /**
     80  * 解析二维码中包含的内容
     81  * @param imgPath 二维码图片路径
     82  * @return
     83  */
     84 public static String decoderQRCode(String imgPath) {  
     85     // QRCode 二维码图片的文件  
     86     File imageFile = new File(imgPath);  
     87     BufferedImage bufImg = null;  
     88     String content = null;  
     89     try {  
     90         bufImg = ImageIO.read(imageFile);  
     91         QRCodeDecoder decoder = new QRCodeDecoder();  
     92         content = new String(decoder.decode(new CodeImage(bufImg)), "utf-8");   
     93     } catch (IOException e) {  
     94         System.out.println("Error: " + e.getMessage());  
     95         e.printStackTrace();  
     96     } catch (DecodingFailedException dfe) {  
     97         System.out.println("Error: " + dfe.getMessage());  
     98         dfe.printStackTrace();  
     99     }  
    100     return content;  
    101 } 
    102 }
     1 package com.test;
     2 
     3 import java.awt.image.BufferedImage;
     4 
     5 import jp.sourceforge.qrcode.data.QRCodeImage;
     6 
     7 
     8 public class CodeImage implements QRCodeImage{
     9      BufferedImage bufImg; 
    10      public CodeImage(BufferedImage bufImg){
    11          this.bufImg=bufImg;
    12      }
    13      @Override  
    14         public int getHeight() {  
    15             return bufImg.getHeight();  
    16         }  
    17       
    18         @Override  
    19         public int getPixel(int x, int y) {  
    20             return bufImg.getRGB(x, y);  
    21         }  
    22       
    23         @Override  
    24         public int getWidth() {  
    25             return bufImg.getWidth();  
    26         }  
    27       
    28 
    29 }

    关于解析的时候报错:Invalid number of Finder Pattern detected 是因为生成二维码的时候设置的图片长宽过大,而二维码只占了其中左上角一部分,导致解析出错。只需调整长宽即可。

  • 相关阅读:
    moya
    语言是人脑中影像的表述工具
    Ad-hoc--拉丁文--for this purpose only
    语言是人类对自我意识的表述工具:对世界和事物多深刻的认识,就会有多丰富和符合 逻辑的语言表述
    知行合一:知其然知其所以然
    语言是世界观、方法论的重组和表述
    任何能用编程语言描述的东西都能够用人类语言描述
    面向对象的几个视角
    待解决问题 jscore 与 node.js jsbridge
    浅谈CSRF攻击方式
  • 原文地址:https://www.cnblogs.com/cuiyf/p/3679292.html
Copyright © 2020-2023  润新知