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