在上一篇分析了google的Zxing条码扫描库的源码:分析google的Zxing条码扫描库源码
这里提一下如何简洁的使用Zxing的库。网上有很多基于Zxing的包含Android部分修改后的可用库,但是笔者始终觉得内容有些臃肿和使用不自由、灵活。

其实,我们只要使用Zxing的core里面的内容就够了,android部分的可以完全由自己设计。
最最直接的方法是拿core里面我们使用到的部分代码进行修改,精简后加到自己的工程里。但是这种还是有些麻烦,需要花费一点时间去细看源码。
其实,还有更快速使用的方法:使用core打包好的jar库。
Zxing的Jar包下载地址
下载目前最新的版本:core-3.3.3.jar。
然后新建一个android工程,将core-3.3.3.jar文件放在libs文件夹下,右键jar包选择“Add As Library”。
Zxing便已导入android工程中。
二维码解码:

1
2
3
4
5
6
7
8
qrCodeReader = new QRCodeReader();
try {
rawResult = qrCodeReader.decode(bitmap);
}catch (ReaderException re){
//Log.i("解码异常",re.toString());
}finally {
qrCodeReader.reset();
}

成功解码得出的内容:
1.文本信息:

1
rawresult.getText()

2.位置信息:

1
2
3
4
ResultPoint[] points = rawresult.getResultPoints();
ResultPoint bottomLeft = points[0];
ResultPoint topLeft = points[1];
ResultPoint topRight = points[2];

一个调用手机摄像头,全屏识别二维码,并标记二维码位置的android demo:
QRcodeDemo
这个demo简单的调用了zxing的core的jar的库,摄像头部分使用zxing安卓的camera源码并做了一点点的修改。
app结构.JPG

效果如下:
Screenshot_20180807-170506.jpg

Screenshot_20180807-170555.jpg

Screenshot_20180807-170607.jpg

屏幕上用绿框标记了二维码三个定位点的位置,直接从rawresult中读出来的位置信息作者发现与屏幕上显示的实际的位置有偏差,而且状态看上去像是对原图1920*1080做了缩小处理。查看了core的detect源码,并未发现在哪一处做了明显的缩放处理,无奈在获取到rawresult数据后稍微处理了一下,这才与实际显示有相近的匹配。
在屏幕上显示的几行数据表示的意思:

  • QRcode content:二维码的信息
  • QRcode pix_center x: 二维码中心位置的x的像素坐标(对应width)
  • QRcode pix_center y: 二维码中心位置的y的像素坐标(对应height)
  • QRcode percent_center x: 二维码中心位置的x的相对于屏幕的百分比坐标
  • QRcode percent_center y: 二维码中心位置的y的相对于屏幕的百分比坐标
  • QRcode rotate angle:二维码相对于摄像头旋转的角度。

QRcode rotate angle计算过程:
1.以二维码左上角的定位点为坐标系原点,以右上角的定位点作为动点。
2.计算Δx = topRight.x - topLeft.x, Δy = topRight.y - topLeft.y
3.计算两点之间的距离:Δl = sqrt(pow(Δx,2) + pow(Δy,2))
4.计算角度angle = arcsin(Δy / Δl ),要注意到这里的角度信息,包含了y的正负信息,但是x的正负未考虑进去,所得到的角度还要做进一步的区分:

1
2
3
4
5
6
伪代码:
if (Δy > 0){
if(Δx < 0) angle = PI - angle;
} else {
if(Δx < 0) angle = -PI - angle;
}