Java實現帶logo的二維碼

Java實現帶logo的二維碼

二維碼應用到生活的各個方面,會用代碼實現二維碼,我想必定是一項加分的技能。好了,咱們來一塊兒實現一下吧。java

咱們實現的二維碼是基於QR Code的標準的,QR Code是由日本Denso公司於1994年研製的一種矩陣二維碼符號碼,全稱是Quick Response Codedom

QR Code:專利公開,支持中文;maven

QR Code與其餘二維碼相比,具備識讀速度快、數據密度大、佔用空間小的優點;函數

糾錯能力:工具

L級:約可糾錯7%的數據碼字 M級:約可糾錯15%的數據碼字 Q級:約可糾錯25%的數據碼字 H級:約可糾錯30%的數據碼字測試

知道了這些硬知識後,咱們作一下準備工做,咱們須要下載兩個jar包,輔助咱們開發,這裏我放上連接 http://mavenrepository.com/artifact/com.google.zxing/javase http://mavenrepository.com/artifact/com.google.zxing/core/3.3.2ui

咱們在咱們的工程下,新建一個java project 項目就能夠了,能夠新建三個lib、utils、test三個文件夾;lib存放jar包,utils放咱們寫的工具類,test用來放咱們寫的測試類this

咱們先從不帶logo的二維碼開始
思路:

一、設置一些二維碼的參數;如 字符集、外邊距、容錯等級google

二、生成二維碼spa

好了,咱們來實現一下

/**
	 * 
	 * @param width 二維碼的寬
	 *            
	 * @param height 二維碼的高
	 *            
	 * @param content 二維碼的內容
	 *            
	 */
	public static void createQrCode(int width, int height, String content) {

		// 一、設置二維碼的一些參數
		HashMap hints = new HashMap();

		// 1.1設置字符集
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

		// 1.2設置容錯等級;由於有了容錯,在必定範圍內能夠把二維碼p成你喜歡的樣式
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);

		// 1.3設置外邊距;(即白色區域)
		hints.put(EncodeHintType.MARGIN, 1);

		// 二、生成二維碼

		try {
			// 2.1定義BitMatrix對象
			BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

			// 2.二、設置二維碼存放路徑,以及二維碼的名字
			Path codePath = new File("c:/Users/admin/Desktop/code/" + UUID.randomUUID() + ".png").toPath();

			// 2.三、執行生成二維碼
			MatrixToImageWriter.writeToPath(bitMatrix, "png", codePath);

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
咱們來實現一下帶logo的二維碼
思路:

一、 咱們先生成一個LogoConfig的配置類,主要是設置logo邊框顏色;logo邊框寬度;logo大小

二、 設置一些二維碼的參數

三、 生成二維碼

四、 生成帶logo的二維碼

咱們來實現一下

LogoConfig類
class LogoConfig {
	// logo默認邊框顏色
	public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
	// logo默認邊框寬度
	public static final int DEFAULT_BORDER = 2;
	// logo大小默認爲照片的1/6
	public static final int DEFAULT_LOGOPART = 6;

	private final int border = DEFAULT_BORDER;
	private final Color borderColor;
	private final int logoPart;

	public LogoConfig() {
		this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
	}

	public LogoConfig(Color borderColor, int logoPart) {
		this.borderColor = borderColor;
		this.logoPart = logoPart;
	}

	public Color getBorderColor() {
		return borderColor;
	}

	public int getBorder() {
		return border;
	}

	public int getLogoPart() {
		return logoPart;
	}
}
生成中間有logo的二維碼的工具函數
/**
	 * 生成中間有logo的二維碼
	 * 
	 * @param width
	 * @param height
	 * @param content
	 */
	public static void createLogoQrCode(int width, int height, String content) {

		// 一、設置二維碼的一些參數
		HashMap hints = new HashMap();

		// 1.1設置字符集
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

		// 1.2設置容錯等級;由於有了容錯,在必定範圍內能夠把二維碼p成你喜歡的樣式
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

		// 1.3設置外邊距;(即白色區域)
		hints.put(EncodeHintType.MARGIN, 1);

		// 二、生成二維碼

		try {
			// 2.1定義BitMatrix對象
			BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

			// 2.二、設置二維碼存放路徑,以及二維碼的名字

			// qrFile用來存放生成的二維碼圖片
			File qrFile = new File("c:/Users/admin/Desktop/code", UUID.randomUUID() + ".jpg");

			// logoFile用來存放帶有logo的二維碼圖片
			File logoFile = new File("c:/Users/admin/Desktop/code", "test.jpg");

			// 2.三、執行生成二維碼
			MatrixToImageWriter.writeToPath(bitMatrix, "jpg", qrFile.toPath());

			// 2.4在二維碼中添加logo
			LogoConfig logoConfig = new LogoConfig();
			addLogo(qrFile, logoFile, logoConfig);
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
添加logo的工具類
/**
	 * 
	 * @param qrPic 二維碼文件路徑
	 * @param logoPic logo文件路徑
	 * @param logoConfig 配置類
	 */
	private static void addLogo(File qrPic, File logoPic, LogoConfig logoConfig) {

		if (!qrPic.isFile() || !logoPic.isFile()) {
			System.out.println("file not found!");
			System.exit(0);
		}

		try {

			// 一、讀取二維碼圖片,並構建繪圖對象
			BufferedImage image = ImageIO.read(qrPic);
			Graphics2D graph = image.createGraphics();

			// 二、讀取logo圖片
			BufferedImage logo = ImageIO.read(logoPic);

			int widthLogo = image.getWidth() / logoConfig.getLogoPart();
			int heightLogo = image.getHeight() / logoConfig.getLogoPart();

			// 三、計算圖片放置的位置
			int x = (image.getWidth() - widthLogo) / 2;
			int y = (image.getHeight() - heightLogo) / 2;

			// 四、繪製圖片
			graph.drawImage(logo, x, y, widthLogo, heightLogo, null);
			graph.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10);
			graph.setStroke(new BasicStroke(logoConfig.getBorder()));
			graph.setColor(logoConfig.getBorderColor());
			graph.drawRect(x, y, widthLogo, heightLogo);

			graph.dispose();
			
			ImageIO.write(image, "jpeg", new File("C:/Users/admin/Desktop/code/newPic.jpg"));

		} catch (Exception e) {
			System.out.println(e);

		}
	}

咱們寫一個測試類來測試一下

@Test
public void test() {
		QrCodeUtils.createQrCode(100, 100, "你好,世界");
		
		QrCodeUtils.readQrCode("C:\\Users\\admin\\Desktop\\code\\4ad3a0a4-8d5c-4cd3-9ee5-5f680233a33f.png");
		
		QrCodeUtils.createLogoQrCode(300, 300, "https://www.jianshu.com/u/f84a2d49420b");
		QrCodeUtils.readQrCode("C:\\Users\\admin\\Desktop\\code\\newPic.jpg");
	}

我就不放生成好的二維碼了,你們能夠本身試試

咱們補充一個讀取二維碼內容的工具函數

/**
	 * 解析二維碼
	 * 
	 * @param codePath 二維碼存放全路徑 
	 *            
	 */
	public static void readQrCode(String codePath) {

		try {

			MultiFormatReader formatReader = new MultiFormatReader();

			File QrCode = new File(codePath);

			BufferedImage image = ImageIO.read(QrCode);

			BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));

			// 設置二維碼的參數
			HashMap hints = new HashMap();

			hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

			Result result = formatReader.decode(binaryBitmap, hints);

			// 打印解析結果
			System.out.println(result.toString());

			// 打印二維碼格式
			System.out.println(result.getBarcodeFormat());

			// 二維碼文本內容
			System.out.println(result.getText());

		} catch (Exception e) {
			System.out.println(e);
		}

	}

注:二維碼是有必定糾錯能力的,你能夠把二維碼p成你喜歡的樣式

相關文章
相關標籤/搜索