首先必須的jar包文件:百度云盤下載
Qrcode.jar Qrcode_Swetake.jar 這兩個就是我們的主角
學(xué)習之前可以簡單了解一下:二維碼原理
將jar文件復(fù)制進去,選中jar文件右鍵BuildPath -- Add to BuildPath (旁白:這么簡單的操作你都還要講!)
進入正題:
代碼如下: 為方面同學(xué)理解 注釋較多 請理解 如感不適 請見諒
(旁白:廢話太多了 我要看代碼!)
生成Qrcode代碼:
新建 QrcodeDemo.java
package qrcode;import java.awt.Color;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.io.UnsupportedEncodingException;import javax.imageio.ImageIO;import com.swetake.util.Qrcode;public class QrcodeDemo { public static void main(String[] args) throws UnsupportedEncodingException { Qrcode qrcode=new Qrcode(); //二維碼包含:數(shù)據(jù)和糾錯碼字:實際保存的二維碼信息,和糾錯碼字(用于修正二維碼損壞帶來的錯誤) //格式信息:表示改二維碼的糾錯級別,分為L、M、Q、H //錯誤修正容量 //L水平 7%的字碼可被修正 //M水平 15%的字碼可被修正 //Q水平 25%的字碼可被修正 //H水平 30%的字碼可被修正 //Qrcode有容錯能力,Qrcode圖形如果有破損,仍然可以被讀取內(nèi)容,最高可以到30%面積破損仍可被讀取。 //相對而言,容錯率愈高,Qrcode圖形面積愈大。 //所以一般折衷使用15%容錯能力 - 'M' qrcode.setQrcodeErrorCorrect('M'); //B 以2進制形式 進行信息存儲 qrcode.setQrcodeEncodeMode('B'); //設(shè)置Qrcode版本 //QR碼符號共有40種規(guī)格的矩陣(一般為黑白色) //從21x21(版本1),到177x177(版本40) //每一版本符號比前一版本 每邊增加4個模塊 //常用版本為7 如支付寶版本 qrcode.setQrcodeVersion(7); //創(chuàng)建圖片的存儲空間 - 流空間 BufferedImage img=new BufferedImage(140,140,BufferedImage.TYPE_INT_RGB);//常量 8位 顏色的圖片 //畫筆工具 Graphics2D g=img.createGraphics(); g.setBackground(Color.white); g.clearRect(0, 0, 140, 140); g.setColor(Color.black); File file=new File("/Users/Summer/Desktop/二維碼.png"); //數(shù)據(jù)信息 String str="http://www.baidu.com"; byte[] data =str.getBytes(); //生成的cal boolean[][] qrcodeDate=qrcode.calQrcode(data); // 設(shè)置偏移量 不設(shè)置可能導(dǎo)致解析出錯 int offset=2; for (int i = 0; i < qrcodeDate.length; i++) { for (int j = 0; j < qrcodeDate.length; j++) { /* 必須做判定 判定為true的部分進行打印*/ if(qrcodeDate[j][i]){//注意j i的位置 否則可能導(dǎo)致后續(xù)無法解析 //主意j i的位置 防止繪制錯誤 g.fillRect(j*3+offset,i*3+offset,3,3); /* * 以下尺寸合適,二維碼居中 * 100*100 (j*2+5,i*2+5,3,3) * 140*140 (j*3+2,i*3+2,3,3) * 300*300 (j*6+15,i*6+15,6,6); */ } } } //刷新 img.flush(); //釋放資源 g.dispose(); try { //流寫入文件 ImageIO.write(img,"png",file); } catch (IOException e) { e.printStackTrace(); } }}
解析Qrcode:
新建 DecodeDemo.java
package qrcode;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import jp.sourceforge.qrcode.QRCodeDecoder;import jp.sourceforge.qrcode.data.QRCodeImage;public class DecodeDemo { public static void main(String[] args) { BufferedImage img = null; try { //讀取到流中.. img = ImageIO.read(new File("/Users/Summer/Desktop/2維碼.png")); } catch (IOException e) { e.printStackTrace(); } //QRCodeDecoder對象 進行解析操作 QRCodeDecoder qrcodeDecoder = new QRCodeDecoder(); //讀取數(shù)據(jù) byte[] //注意該方法參數(shù) 需要QRCodeImage對象 自己寫對象實現(xiàn)和重寫 byte[] decodeByte = qrcodeDecoder.decode(new qrcodeImg(img)); String s = new String(decodeByte); System.out.println(s); }}//實現(xiàn)QRCodeImageclass qrcodeImg implements QRCodeImage { public BufferedImage img; public qrcodeImg(BufferedImage img) { this.img = img; } @Override public int getHeight() { return img.getHeight(); } @Override public int getPixel(int x, int y) { return img.getRGB(x, y); } @Override public int getWidth() { return img.getWidth(); }}
當然大家也可以提取成工具類 (工具類:方便工作時隨意復(fù)制粘貼)
新聞熱點
疑難解答