二維碼 QR碼編碼原理詳解
5.構(gòu)造矩陣:將探測(cè)圖形、分隔符、定位圖形、校正圖形和碼字模塊放入矩陣中。
把上面的完整序列填充到相應(yīng)規(guī)格的二維碼矩陣的區(qū)域中
6. 掩摸:將掩摸圖形用于符號(hào)的編碼區(qū)域,使得二維碼圖形中的深色和淺色(黑色和白色)區(qū)域能夠比率最優(yōu)的分布。
一個(gè)算法,不研究了,有興趣的同學(xué)可以繼續(xù)。
7. 格式和版本信息:生成格式和版本信息放入相應(yīng)區(qū)域內(nèi)。
版本7-40都包含了版本信息,沒(méi)有版本信息的全為0。二維碼上兩個(gè)位置包含了版本信息,它們是冗余的。
版本信息共18位,6X3的矩陣,其中6位時(shí)數(shù)據(jù)為,如版本號(hào)8,數(shù)據(jù)位的信息時(shí) 001000,后面的12位是糾錯(cuò)位。
至此,二維碼的編碼流程基本完成了,下面就來(lái)實(shí)踐一下吧,當(dāng)然不用自己再去編寫(xiě)上面的算法了,使用三方包zxing 就可以了。
編碼:
public static void encode(String content, String format, String filePath) {
try {
Hashtable hints = new Hashtable();//設(shè)置編碼類(lèi)型
hints.put(EncodeHintType.CHARACTER_SET, DEFAULT_ENCODING);
//編碼
BitMatrix bitMatrix = new QRCodeWriter().encode(content,
BarcodeFormat.QR_CODE, DEFAULT_IMAGE_WIDTH,
DEFAULT_IMAGE_HEIGHT,hints);
//輸出到文件,也可以輸出到流
File file = new File(filePath);
MatrixToImageWriter.writeToFile(bitMatrix, format, file);
} catch (IOException e) {
e.printStackTrace();
} catch (WriterException e1) {
e1.printStackTrace();
}
}
解碼:
BufferedImage image = ImageIO.read(file);//讀取文件
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(
source));
//解碼
Result result = new MultiFormatReader().decode(bitmap);
String resultStr = result.getText();
System.out.println(resultStr);
評(píng)論