1. 程式人生 > >使用Java生成二維碼

使用Java生成二維碼

二維碼應該稱為二維條碼,掃描之後可以獲得更多資料


QR碼全稱為快速響應矩陣碼,1994年日本一個公司發明

黑色表示1,白色表示0

3個角落比較像“回”字,叫定位點

容錯機制,當7%~30%破損任可以被讀取,可以利用這個機制在二維碼中放入一些小的logo

最多可以儲存7089個數字字元或4296個字母或1800箇中文漢字(gbk)

目前在Github上最流行的java實現條形碼庫是:




javase的相關jar包下載方式相同

下面這張圖片是各個包中的幫助文件,在主頁面中


將兩個jar包複製到java專案中,並且新增到內路徑上



package com.laning.qrcode;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;

public class QRCode {
	
	private static int index =1;

	//main方法,方法的入口
	public static void main(String[] args) {
		String str1 = "李長斌有毛病,哈哈哈";
		String str2 = "劉志文有毛病,哈哈哈";
		String str3 = "李  明有毛病,哈哈哈";
		File dstfile1 = new File("E:/大一課程/java程式設計/JAVA生成二維碼jar包");
		
		try {
			createQRCode(str1, dstfile1);
			createQRCode(str2, dstfile1);
			createQRCode(str3, dstfile1);
		} catch (WriterException | IOException e) {
			e.printStackTrace();
		}
		
		createLogoQRCode(new File("E:/大一課程/java程式設計/JAVA生成二維碼jar包/1.jpg"), str1,dstfile1 );
	}
	
	//專門用於生成二維碼的工具方法
	private static void createQRCode(String str ,File dst) throws WriterException, IOException{
		//該類用於多種格式二維碼的編碼
		MultiFormatWriter writer = new MultiFormatWriter();
		//用來設定二維碼的寬高
		int width = 200;
		int height = 200;
		//用來設定二維碼的一些屬性
		HashMap<EncodeHintType,Object> hints = new HashMap<>();
		hints.put(EncodeHintType.CHARACTER_SET,"utf-8");
		//用來編寫二維碼,返回二進位制矩陣資料
		BitMatrix bitmatrix = writer.encode(str,BarcodeFormat.QR_CODE, width, height,hints);
		//三個引數,二進位制矩陣陣列,圖片的格式,圖片儲存的路徑
		MatrixToImageWriter.writeToPath(bitmatrix,"png",new File(dst.getPath()+"/"+(index++)+".png").toPath());
	}
	
	//利用二維碼容錯機制生成一個簡單的logo的工具方法,三個引數分別是目標圖片,想要展示的內容,二維碼存放地址
	private static void createLogoQRCode(File dstimg,String str,File dst){
		
		//該類用於多種格式二維碼的編碼
		MultiFormatWriter writer = new MultiFormatWriter();
		//用來設定二維碼的寬高
		int width = 200;
		int height = 200;
		//用來設定二維碼的一些屬性
		HashMap<EncodeHintType,Object> hints = new HashMap<>();
		hints.put(EncodeHintType.CHARACTER_SET,"utf-8");
		//用來編寫二維碼,返回二進位制矩陣資料
		BitMatrix bitmatrix = null;
		try {
			bitmatrix = writer.encode(str,BarcodeFormat.QR_CODE, width, height,hints);
		} catch (WriterException e1) {
			e1.printStackTrace();
		}
		
		//建立圖片,寬,高,
		BufferedImage qr = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		
		for(int x=0;x<width;x++){
			for(int y=0;y<height;y++){
				if(bitmatrix.get(x, y)){//如果矩陣陣列中有點的話,可以設定任意顏色
					qr.setRGB(x, y, 0xff0000);
				}else{
					qr.setRGB(x, y, 0xffffff);
				}
			}
		}
		
		Image logoUse = null;
		//將logo縮小,寬,高,縮小方式
		int logoW=30;
		int logoH=30;
		try {
			//讀取logo
			BufferedImage logoImg = ImageIO.read(dstimg);
			logoUse = logoImg.getScaledInstance(logoW,logoH,Image.SCALE_FAST);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//獲取畫筆
		Graphics g = qr.getGraphics();
		//繪製Logo,x座標,y座標
		int logoX = (width-logoW)/2;
		int logoY = (height-logoH)/2;
		
		g.drawImage(logoUse,logoX,logoY, null);
		
		try {
			ImageIO.write(qr, "png",new File(dst.getPath()+"/"+(index++)+".png"));
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}