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 是因为生成二维码的时候设置的图片长宽过大,而二维码只占了其中左上角一部分,导致解析出错。只需调整长宽即可。

posted @ 2014-04-21 21:55  CalronLoveRonnie  阅读(7058)  评论(0编辑  收藏  举报
AmazingCounters.com