android-zxingLibrary 二维码扫描和生成
本文主要有两个内容
1.二维码是什么?
2.android项目中借助android-zxingLibrary快速实现二维码功能
1.二维码是什么?
参考博客地址:
http://blog.youkuaiyun.com/u012611878/article/details/53167009
http://www.jianshu.com/p/f68a9d78d08e
二维码,又称二维条码,它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形。相比一维的条码,二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息,同时可以有较高的容错能力。
1.1 二维码的分类
1.堆叠式/行排式二维条码
堆叠式/行排式二维条码又称堆积式二维条码或层排式二维条码,其编码原理是建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容。但由于行数的增加,需要对行进行判定,其译码算法与软件也不完全相同于一维条码。有代表性的行排式二维条码有:Code 16K、Code 49、PDF417、MicroPDF417 等。
2. 矩阵式二维码
最流行莫过于QR CODE ,我们常说的二维码就是它了。矩阵式二维条码(又称棋盘式二维条码)它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。具有代表性的矩阵式二维条码有:Code One、MaxiCode、QR Code、 Data Matrix、Han Xin Code、Grid Matrix 等。
二维码在现实生活中的应用越来越普遍由于QR CODE的流行,二维码又称QR code。
1.2 QR码的特点
- 1.存储大容量信息,相对于传统的条形码
- 2.在小空间内打印,QR码使用纵向和横向两个方向处理数据,如果是相同的信息量,QR码所占空间为条形码的十分之一左右
- 3.有效表现各种字母,日本国产的二维码,因此非常适合处理日文字母和汉字
- 4.对变脏和破损的适应能力强,)即使部分编码变脏或破损,也可以恢复数据。数据恢复以码字为单位(是组成内部数据的单位,在QR码的情况下,每8比特代表1码字),最多可以纠错约30%(根据变脏和破损程度的不同,也存在无法恢复的情况
- 5.可以从任意方向读取,QR码从360°任一方向均可快速读取。其奥秘就在于QR码中的3处定位图案
- 6.支持数据合并功能,QR码可以将数据分割为多个编码,最多支持16个QR码
1.3 QR码的编码过程
1.数据分析:确定编码的字符类型,按相应的字符集转换成符号字符; 选择纠错等级,在规格一定的条件下,纠错等级越高其真实数据的容量越小。
2.数据编码:将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容
3.纠错编码:按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列
4.构造最终数据信息:在规格确定的条件下,将上面产生的序列按次序放如分块中。
5.构造矩阵:将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中。
6.掩摸:将掩摸图形用于符号的编码区域,使得二维码图形中的深色和浅色(黑色和白色)区域能够比率最优的分布。
7.格式和版本信息:生成格式和版本信息放入相应区域内。
1.4 QBar识别和解码
- 读取视频或图像,通过灰度化处理得到单张灰度图;
- 对灰度图进行处理得到二值图像(二值化)
- 将二值图输入不同的解码器识别是否存在二维码
- 如果检测到存在某种编码,即通过相应的解码器进行解码,并返回解码结果
1.5 总结
二维码(QR)本质就是一个字符串,生成和扫描二维码的过程就是编码和解码。在这个过程中由于使用了效验所以导致二维码中内容是大于真实内容的。开始的二维码都是黑白图像,因为内容编码后是01序列,非常适合用二值图像显示;但是现在的可以是五颜六色的,这个也很好理解,白色还是1,其他的颜色都当成0就可以了
2.android-zxingLibrary
GitHub: https://github.com/yipianfengye/android-zxingLibrary
作者博客地址 : http://blog.youkuaiyun.com/qq_23547831/article/details/52037710?reload
2.1 主要几个常用的功能
- 扫描二维码
- 生成二维码
- 从本地读取图片扫描(在实践过程中有点问题,没有实现,但是不影响这个库的强大)
- 扫描二维码界面的UI改变(没有实践)
2.2 使用方式
2.1 gradle依赖
compile 'cn.yipianfengye.android:zxing-library:2.2'
2.2 权限申请 , 相机,震动等
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
2.3使用
1.扫描
//扫描二维码
findViewById(R.id.btn_scan).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this , CaptureActivity.class);
startActivityForResult(intent , SCAN);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == SCAN){
if(data != null){
Bundle bundle = data.getExtras();
if(bundle == null){
Log.e(TAG, "onActivityResult: "+ "error" );
}
if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS){
String result = bundle.getString(CodeUtils.RESULT_STRING);
Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
}else if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED){
Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
}
}
}
2.生成二维码
findViewById(R.id.btn_create).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String content = et.getText().toString();
if(TextUtils.isEmpty(content)){
Toast.makeText(MainActivity.this, "输入为null", Toast.LENGTH_SHORT).show();
return;
}
et.setText("");
iv.setImageBitmap(CodeUtils.createImage(content , 400 , 400 , null));
}
});