Atitit java 二維碼識別 圖片識別
1.1. 解碼1
1.2. 首先,我們先說一下二維碼一共有40個尺寸。官方叫版本Version。1
1.3. 二維碼的樣例:2
1.4. 定位圖案2
1.5. 數據編碼3
1.6. 錯誤修正容量L水平7%的字碼可被修正M水平15%的字碼可被修正Q水平25%的字碼可被修正H水平30%的字碼可被修正3
1.7. QR是怎么對數據碼加上糾錯碼的?3
1.8. 畫二維碼圖4
1.9. 簡要的編碼過程:數據分析:確定編碼的字符類型,按相應的字符集轉換成符號字符; 選擇糾錯等級,7
1.10. qr長度容量7
1.1.解碼
編碼lib:Qrcode_swetake.jar (官網介紹-- http://www.swetake.com/qr/index-e.html)
解碼lib:qrcode.jar (官網介紹-- http://sourceforge.jp/projects/qrcode/)
1.2.首先,我們先說一下二維碼一共有40個尺寸。官方叫版本Version。
Version 1是21 x 21的矩陣,Version 2是 25 x 25的矩陣,Version 3是29的尺寸,每增加一個version,就會增加4的尺寸,公式是:(V-1)*4 + 21(V是版本號) 最高Version 40,(40-1)*4+21 = 177,所以最高是177 x 177 的正方形。
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
QRCodeDecoderHandler handler = new QRCodeDecoderHandler();
String imgPath = "c:\\3bf33a87e950352a5936aa0a5543fbf2b2118b59.jpg";
String decoderContent = handler.decoderQRCode(imgPath,"gbk");
System.out.println("解析結果如下:");
System.out.println(decoderContent);
System.out.println("========decoder success !!!");
}
1.3. 二維碼的樣例:
1.4.定位圖案
Position Detection Pattern是定位圖案,用於標記二維碼的矩形大小。這三個定位圖案有白邊叫Separators for Postion Detection Patterns。之所以三個而不是四個意思就是三個就可以標識一個矩形了。
Timing Patterns也是用於定位的。原因是二維碼有40種尺寸,尺寸過大了后需要有根標准線,不然掃描的時候可能會掃歪了。
Alignment Patterns 只有Version 2以上(包括Version2)的二維碼需要這個東東,同樣是為了定位用的。
功能性數據
Format Information 存在於所有的尺寸中,用於存放一些格式化數據的。
Version Information 在 >= Version 7以上,需要預留兩塊3 x 6的區域存放一些版本信息。
數據碼和糾錯碼
除了上述的那些地方,剩下的地方存放 Data Code 數據碼 和 Error Correction Code 糾錯碼。
1.5.數據編碼
我們先來說說數據編碼。QR碼支持如下的編碼:數字,字符,byte
1.6.錯誤修正容量L水平7%的字碼可被修正M水平15%的字碼可被修正Q水平25%的字碼可被修正H水平30%的字碼可被修正
1.7.QR是怎么對數據碼加上糾錯碼的?
首先,我們需要對數據碼進行分組,也就是分成不同的Block,然后對各個Block進行糾錯編碼,對於如何分組,我們可以查看QR Code Spec的第33頁到44頁的Table-13到Table-22的定義表。注意最后兩列:
1.8.畫二維碼圖
Position Detection Pattern
首先,先把Position Detection圖案畫在三個角上。
1.8.1.1.1.Alignment Pattern
然后,再把Alignment圖案畫上
關於Ali
1.8.1.1.2.Timing Pattern
接下來是Timing Pattern的線(這個不用多說了)
1.8.1.1.3.Format Information
再接下來是Formation Information,下圖中的藍色部分。
Format Information是一個15個bits的信息,每一個bit的位置如下圖所示:(注意圖中的Dark Module,那是永遠出現的)
這15個bits中包括:
5個數據bits:其中,2個bits用於表示使用什么樣的Error Correction Level, 3個bits表示使用什么樣的Mask
10個糾錯bits。主要通過BCH Code來計算
然后15個bits還要與101010000010010做XOR操作。這樣就保證不會因為我們選用了00的糾錯級別,以及000的Mask,從重造
1.8.1.1.4.Version Information
再接下來是Version Information(版本7以后需要這個編碼),下圖中的藍色部分。
Version Information一共是18個bits,其中包括6個bits的版本號以及12個bits的糾錯碼,下面是一個示例:
數據和數據糾錯碼
然后是填接我們的最終編碼,最終編碼的填充方式如下:從左下角開始沿着紅線填我們的各個bits,1是黑色,0是白色。如果遇到了上面的非數據區,則繞開或跳過。
掩碼圖案
這樣下來,我們的圖就填好了,但是,也許那些點並不均衡,所以,我們還要做Masking操作(靠,還嫌不復雜)QR的Spec中說了,QR有8個 Mask你可以使用,如下所示:其中,各個mask的公式在各個圖下面。所謂mask,說白了,就是和上面生成的圖做XOR操作。Mask只會和數據區進 行XOR,不會影響功能區。
1.9.簡要的編碼過程:數據分析:確定編碼的字符類型,按相應的字符集轉換成符號字符; 選擇糾錯等級,
在規格一定的條件下,糾錯等級越高其真實數據的容量越小。數據編碼:將數據字符轉換為位流,每8位一個碼字,整體構成一個數據的碼字序列。其實知道這個數據碼字序列就知道了二維碼的數據內容。
數據可以按照一種模式進行編碼,以便進行更高效的解碼,例如:對數據:01234567編碼(版本1-H),1)分組:012 345 672)轉成二進制:012→0000001100 345→0101011001 67 →10000113)轉成序列:0000001100 0101011001 10000114)字符數 轉成二進制:8→00000010005)加入模式指示符(上圖數字)0001:0001 0000001000 0000001100 0101011001 1000011對於字母、中文、日文等只是分組的方式、模式等內容有所區別。基本方法是一致的
1.10.qr長度容量
Cn utf8 984
Byte 2953byte
Ch 4296 num 7089
1.11.二維碼的解析
1、定位圖形:首先尋找探測圖形,就是二維碼上的三個方塊。這三個方塊的作用就是不管在哪個方向掃描圖形,都可以掃到,不信可以將手機翻轉測試一下。在通過二維碼上的定位圖形和分隔符確定二維碼信息的圖像。定位圖形確定二維碼符號中模塊的坐標,二維碼中的模塊都是固定的,包括校正圖形,版本信息,數據和糾錯碼。分隔符呢,就是將探測圖形與二維碼信息圖像分開。
2、灰度化二維碼信息像素:手機拍到的圖像都是彩色的,所以拍攝到二維碼也不列外,它也是彩色的,只不過除了黑白,其他顏色非常淺而已。灰度化是指通過顏色的深淺來識別二維碼,就是說顏色深的按深灰處理,淺色的按淺灰處理,去掉其他顏色。
3、去掉二維碼信息像素的噪點:相機的傳感器在把光線作為接收信號和輸出過程產生的粗糙像素,這些粗糙的像素是照片中不應該出現的干擾因素。噪點就是指這些粗糙的像素。
4、二值化二維碼信息像素:二值化是說將圖像上像素灰度值設置為0或者255,也就是變成只有黑白兩種顏色。第一步已經灰度化變成只有深灰和淺灰兩種顏色,現在二值化是將深灰變成黑色,淺灰變成白色。為什么變成黑白色呢。因為二維碼圖像其實是由二進制的0或者1組成,0代表白色,1代表黑色。二維碼在二值化時會將二維碼圖像變成只有黑白色的條碼,然后根據解析公式什么的(因為像素是0-255之間,要全部轉變成0或者255,估計得經過一些計算,然后0就是0,255變為1)轉化成二進制信息。
5、二維碼譯碼和糾錯:將得到的二進制信息進行譯碼和糾錯。得到的二進制信息是版本格式信息、數據和糾錯碼經過一定的編碼方式生成的,所以譯碼是對版本格式信息,數據和糾錯碼進行解碼和對比。糾錯是和譯碼同時進行的,將數據進行糾錯。
Atitit.二維碼功能的設計實踐 attilax 總結 - attilaxAti - 博客園.html
atitit.二維碼生成總結java zxing - attilax的專欄 - 博客頻道 - CSDN.NET.html
Java實現二維碼QRCode的編碼和解碼 - 記憶是夏天 - 博客頻道 - CSDN.NET.html
二維碼的生成細節和原理 - 51CTO.COM.html
二維碼原理介紹_百度經驗.html
二維碼的生成和解析原理 - kelindame的專欄 - 博客頻道 - CSDN.NET.html
二維碼的工作原理_百度知道.html
作者:: 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 )
漢字名:艾提拉(艾龍), EMAIL:1466519819@qq.com
轉載請注明來源: http://www.cnblogs.com/attilax/
Atiend