使用 Qrcode 生成中間帶 logo 的二維碼!

能夠自由定義生成的二維碼中間是否帶 logo !java

package com.controller;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;

import com.entity.CodeImage;
import com.swetake.util.Qrcode;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.exception.DecodingFailedException;

/**
 * @author Mongo
 */
public class QrCode {

	/**
	 * 生成二維碼(QRCode)圖片
	 * 
	 * @param flag (是否帶中間logo)
	 */
	public static void createQRCode(Boolean flag) {
		try {
			
		//================基本信息==============================================
			
			/* 要合成的兩張圖片 */
			String logoPath = "D:/logo.png";//中間logo圖片
			String qrcodePath = "D:/qrcode.png";//二維碼圖片
			
			/* 二維碼種要存儲的信息!(沒有的話,二維碼不展現!) */
			String content = "您的設備已經中毒了,請注意!請注意!";
			
			/* 合成的二維碼的一些特性 */
			String format = "png";//圖片的格式
			char correct = 'H';// 容錯率
			char mode = 'B';// 類型
			int version = 10;// 版本(亦能決定合成後的二維碼大小)

			/* 合成後的二維碼的寬與高 */
			int width = 178;
			int height = 178;
			
		//=====================================================================	
			
			Qrcode qrcodeHandler = new Qrcode();
			/* 設置二維碼排錯率,可選L(7%)、M(15%)、Q(25%)、H(30%),排錯率越高可存儲的信息越少,但對二維碼清晰度的要求越小 */
			qrcodeHandler.setQrcodeErrorCorrect(correct);// 特別注意:這裏使用單引號!! 屬於 char 類型,不是 String 類型
			/* N表明數字,A表明字符a-Z,B表明其餘字符 */
			qrcodeHandler.setQrcodeEncodeMode(mode);
			/* 設置設置二維碼版本,取值範圍1-40,值越大尺寸越大,可存儲的信息越大 */
			qrcodeHandler.setQrcodeVersion(version);

			/* 內容 byte 化 */
			byte[] contentBytes = content.getBytes("UTF-8");

			BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

			Graphics2D gs = bufImg.createGraphics();
			gs.setBackground(Color.WHITE);
			gs.clearRect(0, 0, width, height);//沒有這個,二維碼全黑

			/* 設置圖像顏色 */
			gs.setColor(Color.BLACK);

			/* 設置偏移量 不設置可能致使解析出錯 */
			int pixoff = 2;//中間logo偏移大小
			/* 輸出內容 > 二維碼 */
			if (contentBytes.length > 0 && contentBytes.length < width) {
				boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
				for (int i = 0; i < codeOut.length; i++) {
					for (int j = 0; j < codeOut.length; j++) {
						if (codeOut[j][i]) {
							gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
						}
					}
				}
			} else {
				System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,200]. ");
			}
			
			/* 判斷是否須要添加logo圖片 */
			if (flag) {
				int width_4 = width / 4;
				int width_8 = width_4 / 2;
				int height_4 = height / 4;
				int height_8 = height_4 / 2;
				Image img = ImageIO.read(new File(logoPath));
				gs.drawImage(img, width_4 + width_8, height_4 + height_8, width_4, height_4, null);
				gs.dispose();
				bufImg.flush();
			}

			/* 生成二維碼QRCode圖片 */
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
			String fileName = sdf.format(new Date()) + "." + format;
			String url = qrcodePath + fileName;
			File imgFile = new File(url);
			if (!imgFile.exists()) {
				imgFile.mkdirs();
			}
			ImageIO.write(bufImg, format, imgFile);
			System.out.println("生成二維碼圖片成功!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解析二維碼(直接讀取二維碼信息)
	 */
	public static String decode(String imagePath) {
		// QRCode 二維碼圖片的文件
		File imageFile = new File(imagePath);
		BufferedImage bufImg = null;
		String content = null;
		try {
			bufImg = ImageIO.read(imageFile);
			QRCodeDecoder decoder = new QRCodeDecoder();
			content = new String(decoder.decode(new CodeImage(bufImg)), "utf-8");
		} catch (IOException e) {
			System.out.println("Error: " + e.getMessage());
			e.printStackTrace();
		} catch (DecodingFailedException dfe) {
			System.out.println("Error: " + dfe.getMessage());
			dfe.printStackTrace();
		}
		return content;
	}

	public static void main(String[] args) {
		
		Boolean flag = true;//是否添加中間logo!
		
		QrCode.createQRCode(flag);
//		 String content = QrCode.decode("D:/xxxx.png");//解析二維碼圖片
//		System.out.println("結束="+content);
	}

}

解析二維碼則須要一個實體類:ide

package com.entity;

import java.awt.image.BufferedImage;

import jp.sourceforge.qrcode.data.QRCodeImage;

/**
* @author Mongo
*/
public class CodeImage implements QRCodeImage {

	private BufferedImage bufferedImage;
	
	public CodeImage(BufferedImage image){  
        this.bufferedImage = image;  
    }  
	
	@Override
	public int getHeight() {
		return bufferedImage.getHeight();
	}

	@Override
	public int getPixel(int x, int y) {
		return bufferedImage.getRGB(x, y);
	}

	@Override
	public int getWidth() {
		return bufferedImage.getHeight();
	}

}

須要的 jar 包:this

Qrcode-C.jarurl

qrcode-R.jarcode

相關文章
相關標籤/搜索