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 是由於生成二維碼的時候設置的圖片長寬過大,而二維碼只佔了其中左上角一部分,致使解析出錯。只需調整長寬便可。java