二維碼的生成與簡析
阿新 • • 發佈:2021-02-09
二維碼的生成與簡析
二維碼定義:
先拓展一下一維條碼: 一維條碼就是“條碼條”和“空白”的排列組合,一維條碼的資料只記載在寬度上,長度上不記載任何資料。
二維碼:又稱二維條碼,是指在一維條碼的基礎上擴展出另一維具有可讀性的條碼,使用黑白矩陣圖案儲存記錄資料,用裝置掃描後可以獲取二維碼中所包含的資訊。
二者區別:二維條碼的長度,寬度均記載著資料,而一維條碼只有寬度記載資料。
常見的二維條碼有: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"));
}
}