java實現二維碼的生成和解析包含工具類

1、下載jar包( jdk1.7)

鏈接:https://pan.baidu.com/s/1LVq_zGsp_Po8V456h1TVmA
提取碼:vqyd
在這裏插入圖片描述
在這裏插入圖片描述

2、工具類Utils.java

package test;

import java.awt.Color;
import java.awt.Graphics2D;
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;
import com.swetake.util.Qrcode;
/**
 * 工具類
 * @author Xuan
 *
 */
public class Utils {
	//解析圖片
	private static BufferedImage image = null;
	//
	/**
	 * 生成二維碼
	 * @param srcValue 值
	 * @param qrcodePicfilePath 二維碼圖片生成的路徑
	 */
	public static boolean QrCode_encode(String srcValue, String qrcodePicfilePath){
		//計算二維碼圖片的高寬比
        // API文檔規定計算圖片寬高的方式 ,v是本次測試的版本號
        int v =6;
        int width = 67 + 12 * (v - 1);
        int height = 67 + 12 * (v - 1);

        Qrcode x = new Qrcode();
        /**
         * 糾錯等級分爲
         * level L : 最大 7% 的錯誤能夠被糾正;
         * level M : 最大 15% 的錯誤能夠被糾正;
         * level Q : 最大 25% 的錯誤能夠被糾正;
         * level H : 最大 30% 的錯誤能夠被糾正;
         */
        x.setQrcodeErrorCorrect('L');
        x.setQrcodeEncodeMode('B');//注意版本信息 N代表數字 、A代表 a-z,A-Z、B代表 其他)
        x.setQrcodeVersion(v);
        String qrData = srcValue;
        try {
        	//漢字轉格式需要拋出異常
        	 byte[] d = qrData.getBytes("utf-8");

             //緩衝區
             image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);

             //繪圖
             Graphics2D gs = image.createGraphics();

             gs.setBackground(Color.WHITE);
             gs.setColor(Color.BLACK);
             gs.clearRect(0, 0, width, height);

             //偏移量
             int pixoff = 2;

             if (d.length > 0 && d.length < 120) {
                 boolean[][] s = x.calQrcode(d);

                 for (int i = 0; i < s.length; i++) {
                     for (int j = 0; j < s.length; j++) {
                         if (s[j][i]) {
                             gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                         }
                     }
                 }
             }
             
             gs.dispose();
             image.flush();
             //輸出圖片
             ImageIO.write(image, "png", new File(qrcodePicfilePath));
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
       
        System.out.println("二維碼生成完畢");
        return true;
	}

	/**
	 * 解析二維碼
	 * @param qrcodePicfilePath 二維碼圖片地址
	 * @return
	 */
	public static String QrCode_decode(String qrcodePicfilePath) {
		System.out.println("開始解析二維碼!!");
		File imageFile = new File(qrcodePicfilePath);
		try {

		image = ImageIO.read(imageFile);
		} catch (IOException e) {

		System.out.println("讀取二維碼圖片失敗: " + e.getMessage());

		return null;

		}
		QRCodeDecoder decoder = new QRCodeDecoder();
		String decodedData = new String(decoder.decode(new QRCodeImage() {
			
			@Override
			public int getWidth() {
				return image.getWidth();
			}
			
			@Override
			public int getPixel(int arg0, int arg1) {
				return image.getRGB(arg0, arg1);
			}
			
			@Override
			public int getHeight() {
				return image.getHeight();
			}
		}));
		
		System.out.println("解析內容如下:"+decodedData);
		return decodedData;
	}
}

3、測試類

package test;

/**
 * 二維碼測試類
 * @author Xuan
 *
 */
public class Generate {

	public static void main(String[] args) {
		String data = "CSDN的小白軒";
		//生成二維碼
		Utils.QrCode_encode(data, "C:\\Users\\Administrator\\Desktop\\xiaoxuan.png");
		//解析二維碼
		Utils.QrCode_decode("C:\\Users\\Administrator\\Desktop\\xiaoxuan.png");
	}

}

4、生成效果

在這裏插入圖片描述

5、遇到困難可以評論(有信必回)小軒微信17382121839。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章