關(guān)于二維碼的了解
我們現(xiàn)在常用的二維碼為QR碼作為編碼的碼制,他是在一個(gè)矩形空間內(nèi)通過黑嚎莉、白像素在矩陣中的不同分布來進(jìn)行編碼的。我們知道電腦是使用二進(jìn)制數(shù)字來儲存和處理數(shù)據(jù)的,而在二維碼中华临,用黑白矩陣來表示二進(jìn)制數(shù)據(jù)窘行,而我們?nèi)庋劭吹降暮谏硎镜氖嵌M(jìn)制“1”饥追,白色表示的是二進(jìn)制“0”,黑白的排列組合確定了矩陣式二維碼的內(nèi)容罐盔,以便計(jì)算機(jī)對二維碼符合進(jìn)行編碼和分析但绕。通過黑白表示1和0這就是為什么二維碼都是黑白圖形的原因。
二維碼掃描定位流程:首先手機(jī)拍照惶看,拍到的照片是彩色的捏顺,對于掃描的二維碼也是一樣,他默認(rèn)也是彩色的纬黎,只不過顏色有深淺之分草丧,所以識別軟件正式依靠顏色的深淺來完成對二維碼識別的第一步
- 第一步叫做灰度化,也就是說顏色深的按深灰處理莹桅,顏色淺的按淺灰處理昌执,
僅僅有了灰度還是不夠的烛亦,因?yàn)閽呙柽€受周圍的環(huán)境的影響,會有噪點(diǎn)懂拾,所以 - 第二部就是去噪煤禽。
完成了上面的兩部,就進(jìn)入了至關(guān)重要的二值化流程岖赋,上面已經(jīng)說過計(jì)算機(jī)采用二進(jìn)制檬果,而將深度和淺度灰階的圖案轉(zhuǎn)換成只有黑色和白色兩種顏色,也就是二值化處理的任務(wù)唐断。在二值化處理時(shí)选脊,二維碼將會首先被解讀成白色黑色的條碼。然后根據(jù)解析公式和閾值運(yùn)算將其轉(zhuǎn)化成二進(jìn)制信息脸甘,也許再深入講解公式可能一般人不能理解恳啥,但是我們要知道,二值化是一個(gè)非常復(fù)雜而且需要相當(dāng)準(zhǔn)確的步驟丹诀。 - 結(jié)束了上面步驟后再就是 尋找探測圖形钝的? 也就是找到二維碼的位置,經(jīng)趁猓看二維碼的朋友都知道硝桩,二維碼上有三個(gè)方塊,這三個(gè)方塊有什么作用枚荣?代表了怎樣的含義呢碗脊?其實(shí)它的準(zhǔn)確叫法就是位置探測圖形。有了這三個(gè)點(diǎn)橄妆,不管是從哪個(gè)方向讀取二維碼衙伶,信息都可以被識別。即使將二維碼圖形旋轉(zhuǎn)呼畸,也可以識別痕支。它的作用主要是方便識別和決定二維碼符號中模塊的坐標(biāo)颁虐,當(dāng)?shù)玫搅艘粋€(gè)可識別的二維碼后蛮原,接下來的工作就是譯碼和糾錯(cuò)。
- 譯碼就是對二維碼中所包含的格式信息另绩、版本信息儒陨、數(shù)據(jù)和糾錯(cuò)碼信息進(jìn)行解碼和比對,而糾錯(cuò)是在譯碼的同時(shí)進(jìn)行的笋籽。其實(shí)蹦漠,一個(gè)二維碼除了上面講到的探測圖形外,還有各種譯碼信息被集成在二維碼中车海,通過二維碼包含信息示意圖我們就可以對一個(gè)二維碼所含的信息元素有大概的了解笛园。完成了譯碼,手機(jī)上從二維碼的識別到解碼的工作就完成了。
說到二維碼掃描 那就肯定是少不了 ZXing 庫的使用了研铆,zxing是由google開發(fā)的開源二維碼掃描庫埋同,支持條形碼和二維碼的掃描,git 地址為:zxing github地址棵红。
android庫組成:
- core : 圖片解碼的核心內(nèi)容和測試代碼凶赁。
- javase: javaSE-special 客戶端代碼
- android: android客戶端掃描代碼
- androidtest:android測試app和ZXing 測試代碼。
- android-integration: 支持通過intent 啟動二維碼的掃描逆甜。
- android-core:android 相關(guān)代碼的共享
- glass:簡單的谷歌 glass app虱肄。
zxing還 提供了ios 和 java等客戶端的支持。
cpp
C++ port
iphone
iPhone client
objc
Objective C port
actionscript
Partial ActionScript port
jruby
JRuby wrapper
基于ZXing的第三方庫
這個(gè)使用啟動來要簡單一點(diǎn)交煞,
庫的地址為:https://github.com/journeyapps/zxing-android-embedded
如何使用這個(gè)庫
只需要在build.gradle 文件中添加如下內(nèi)容:
repositories{
jcenter()
}
dependencies{
compile 'com.journeyapps:zxing-android-embedded:3.0.2@aar'
compile 'com.google.zxing:core:3.2.0'
}
然后更新gradle咏窿,就會自動導(dǎo)入庫了
導(dǎo)入完后使用:
//Activity中使用
new IntentIntegrator(this).initiateScan();
/*fragment中使用*/
IntentIntegrator.forFragment(this).initateScan();
//如果使用的是兼容包中的fragment則使用下面的方法
IntentIntegrator.forSupportFragment.initateScan();
如需要更多的設(shè)置可以在:
IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES);
integrator.setPrompt("Scan a barcode");
integrator.setCameraId(0);
// Use a specific camera of the deviceintegrator.setBeepEnabel(false);
integrator.setBarcodeImageEnable(true);integrator.initiateScan();
獲取掃描到的結(jié)果
// Get the results:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if(result != null) {
if(result.getContents() == null) {
Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
設(shè)置方向:
方向這個(gè)問題可以通過 建立一個(gè)CaptureActivityAnyOrientation,這個(gè)activity集成字CaptureActivity错敢,然后你在manifest中設(shè)置這activity的方向翰灾,
<activity android:name=".CaptureActivityAnyOrientation"
android:screenOrientation="fullSensor"
android:stateNotNeeded="true"
android:theme="@style/zxing_CaptureTheme"
android:windowSoftInputMode="stateAlwaysHidden"></activity>
通過設(shè)置這個(gè)capture activity來限制取景界面的方向。
IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setCaptureActivity(CaptrueActivityAnyOrientation.class);
integrator.setOrientationLocked(false);
integrator.initiateScan();