1. 程式人生 > 其它 >二維碼的生成與簡析

二維碼的生成與簡析

二維碼的生成與簡析

二維碼定義:

先拓展一下一維條碼: 一維條碼就是“條碼條”和“空白”的排列組合,一維條碼的資料只記載在寬度上,長度上不記載任何資料。

二維碼:又稱二維條碼,是指在一維條碼的基礎上擴展出另一維具有可讀性的條碼,使用黑白矩陣圖案儲存記錄資料,用裝置掃描後可以獲取二維碼中所包含的資訊。

二者區別:二維條碼的長度,寬度均記載著資料,而一維條碼只有寬度記載資料。

常見的二維條碼有:PDF417碼、QR碼、漢信碼、顏色條碼、EZ碼等。我們日常生活中所常見的二維碼時QR碼。

QR碼:全稱為快速響應矩陣圖碼(quick response Code),1994年由日本一個公司發明,QR碼呈正方形,常見的是黑白兩色,也有彩色的。

QR碼整體來看是一個回字形的正方形圖案,整體來看,三個角落類似“回”字的小圖形是定位點,其餘詳情見圖4。

圖4 QR碼結構圖(本圖片來自 https://www.cnblogs.com/xxaxx/p/3416450.html QR碼有自己獨特的容錯機制,它可以在損毀7%-30%的面積下仍可以被掃描,我們微信裡常見的二維碼名片中間的頭像,就是利用了QR的容錯機制。

java二維碼生成處理步驟:

1.首先我們用到的是eclipse整合環境,配置好環境變數後,匯入jar包,在生成二維碼需要用到兩個jar包:core.jar和javase.jar,這兩個jar包在GitHub上找到下載並配置即可。

2.建立二維碼圖片:

(1)首先設定二維碼長寬(長寬相等),用BufferedImage類在記憶體區域處理圖片,使用迴圈,將資料儲存的碼元設定為黑色,無資料的定義為白色(色彩可對照色碼錶自行嘗試更改)

for(int x = 0;x<w;x++)//建立圖片
		{
			for(int y = 0;y<h;y++)
			{
				if(bitMatrix.get(x, y))
				{
					 qr.setRGB(x, y, 0x000000);//有資料設為黑色
				}
				else
				{
					qr.setRGB(x, y, 0xFFFFFF);//無資料設為白色	
					
				}
			}
		}

(2)設定logo圖片,從電腦中讀取用作logo的圖片,設定其大小,並居中,切記,logo所佔面積不能超過二維碼總面積的30%,否則生成的二維碼無法讀取。

(3)生成二維碼圖片在指定儲存區域。

3.掃描生成的二維碼圖片,讀取儲存的資訊。

下方二維碼是我所生成的二維碼。後附整個程式碼段。歡迎大家批評斧正,如有侵權請及時聯絡。

整體程式碼:

package Test;

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 lulu {
	public static void main(String[] args) throws WriterException, IOException
	{
		MultiFormatWriter writer = new MultiFormatWriter();
		String contents = "錯位時空";
		int w = 200;
		int h = 200;
		HashMap<EncodeHintType,Object> hints = new HashMap<EncodeHintType, Object>();
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//將編碼選項放入,編碼使用字符集
		BitMatrix bitMatrix = writer.encode(contents, BarcodeFormat.QR_CODE, w, h, hints);
		//建立圖片
		BufferedImage qr = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
		Graphics graphics=qr.getGraphics();
		for(int x = 0;x<w;x++)//建立圖片
		{
			for(int y = 0;y<h;y++)
			{
				if(bitMatrix.get(x, y))
				{
					 qr.setRGB(x, y, 0x000000);//有資料設為黑色
				}
				else
				{
					qr.setRGB(x, y, 0xFFFFFF);//無資料設為白色	
					
				}
			}
		}
		//讀取logo
		BufferedImage logoImg = ImageIO.read(new File("f:/3.jpg"));
		int logoW = 30, logoH=30;
		
		Image logoUse = logoImg.getScaledInstance(20, 20, Image.SCALE_FAST);
		//繪製logo
		Graphics g = qr.getGraphics();
		int logoX=(w-logoW)/2;
		int logoY=(h-logoH)/2;
		g.drawImage(logoUse, logoX, logoY, null);
		ImageIO.write(qr, "png", new File("f:/456.png"));
		
	
	}
}