文档章节

【基于zxing的编解码实战】精简Barcode Scanner篇

Madmatrix
 Madmatrix
发布于 2013/12/31 03:12
字数 904
阅读 7105
收藏 48

通过《【搞定条形码】zxing项目源码解读(2.3.0版本,Android部分)》的分析,现在可以实现最终目标了:精简Barcode Scanner并将其中的编码和解码分离为两个独立的部分,方便日后快速集成到自己的项目中去。

编码

在上一篇分析中,对于编码部分已经有所透露,核心部分只有两个package。现在将分享的部分再去掉分享app、分享书签的功能,保留分享剪切板和分享联系人以及编码文本的功能:

image

编码部分的逻辑清晰,代码组织整齐,在前面了解zxing整体结构的基础上一直做减法即可。

精简过后该项目起名为XBarcodeGenerator

可以实现的功能包括:

  • 分享联系人

  • 分享剪切板

  • 编码输入文本

主界面布局稍稍修改了下,新增了一个按钮。代码托管至:Zxing-Simplification


解码

在Barcode Scanner的基础上,做出以下调整:

  • 去掉编码部分。去掉整个com.google.zxing.client.android.encode包及相应布局

  • 去掉分享部分。去掉com.google.zxing.client.android.share包及相应布局

  • 精简设置。去掉“自定义搜索网址”,修改前灯的描述,默认使用自动对焦,去掉搜索国家,没有持续关注

  • 调整横屏为竖屏展示

  • 美化viewfinderview(可选)

调整横屏为竖屏进行扫描共分为5步:

1. 调整CaptureActivity的方向为竖屏显示

修改AndroidManifest.xml中:

android:screenOrientation=“landscape"

android:screenOrientation="portrait"


2. 调整相机预览界面方向

在CameraConfigurationManager.setDesiredCameraParameters的最后增加一行代码:

camera.setDisplayOrientation(90);

调整相机preview的时钟方向与手机竖屏的自然方向一致。该方法必须在startPreview之前被调用,在预览界面展示出来后设置是无效的。

参考:Camera.setDisplayOrientation(int)


3. 调整扫描窗口尺寸

修改CameraManager.getFramingRectInPreview()中的

public synchronized Rect getFramingRectInPreview() {
...
		rect.left = rect.left * cameraResolution.x / screenResolution.x;
		rect.right = rect.right * cameraResolution.x / screenResolution.x;
		rect.top = rect.top * cameraResolution.y / screenResolution.y;
		rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;
		framingRectInPreview = rect;
...
}

修改为:

public synchronized Rect getFramingRectInPreview() {
...
		rect.left = rect.left * cameraResolution.y / screenResolution.x;
		rect.right = rect.right * cameraResolution.y / screenResolution.x;
		rect.top = rect.top * cameraResolution.x / screenResolution.y;
		rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
		framingRectInPreview = rect;
...
}

由于修改了屏幕的初始方向,手机分辨率由原来的width*height变为height*width形式,但是相机的分辨率则是固定的,因此这里需做些调整以计算出正确的缩放比率。


4. 将扫描框设置为正方形

    public synchronized Rect getFramingRect() {
        if (framingRect == null) {
            if (camera == null) {
                return null;
            }
            Point screenResolution = configManager.getScreenResolution();
            if (screenResolution == null) {
                // Called early, before init even finished
                return null;
            }

            int width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH,
                    MAX_FRAME_WIDTH);
            // 将扫描框设置成一个正方形
            int height = width;

            int leftOffset = (screenResolution.x - width) / 2;
            int topOffset = (screenResolution.y - height) / 2;
            framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
            
            Log.d(TAG, "Calculated framing rect: " + framingRect);
        }
        
        return framingRect;
    }

让height=width即可


5. 反转扫描到的图形

修改DecodeHandler.decode方法,增加以下代码

private void decode(byte[] data, int width, int height) {
	long start = System.currentTimeMillis();
	Result rawResult = null;
	
	
	// 新增反转数据代码开始
	byte[] rotatedData = new byte[data.length];
	for (int y = 0; y < height; y++) {
		for (int x = 0; x < width; x++)
			rotatedData[x * height + height - y - 1] = data[x + y * width];
	}
	int tmp = width; 
	width = height;
	height = tmp;
	// 新增结束
	
	PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(rotatedData,
			width, height);
	if (source != null) {
		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
		try {
			// 预览界面最终取到的是个bitmap,然后对其进行解码
			rawResult = multiFormatReader.decodeWithState(bitmap);
		} catch (ReaderException re) {
			// continue
		} finally {
			multiFormatReader.reset();
		}
	}
...


如果要仿照微信做一个扫描窗口,可参考《基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果》

精简过后该项目起名为XBarcodeScanner,代码托管至:Zxing-Simplification

© 著作权归作者所有

Madmatrix
粉丝 23
博文 14
码字总数 20643
作品 0
朝阳
私信 提问
加载中

评论(4)

礼拜贰
礼拜贰
调整横屏为竖屏以后,扫描到的图像变形了(正方形的二维码,取景显示为竖着的长方形了),有没有解决方法?
Madmatrix
Madmatrix

引用来自“droidwolf”的评论

反转扫描到的图形,是什么原理?像素颠倒?
这是旧版本的zxing中的一段代码,新版中已经没有了。原理我没有太深究,你想要深究的话要去看zxing的core库,了解data数组中像素的存放规则
obaniu
obaniu
反转扫描到的图形,是什么原理?像素颠倒?
A
Alliswell_wsm
感觉启动好慢。
Android微信扫描二维码登入实现 基于ZXing开源工程

项目需求,做一个类似微信扫描二维码,网页端登陆的功能实现。 利用开源项目ZXing来实现。ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1...

jeffzhao
2013/02/02
0
7
【基于zxing的编解码实战】zxing项目源码解读(2.3.0版本,Android部分)

zxing2.3.0目录结构(android相关) 下载zxing2.3.0后,与android相关的有三个目录: android:就是Barcode Scanner,中文名"条码扫描器"。下文中简写为BS。 android-integration:提供一种简...

Madmatrix
2013/12/31
0
3
zxing代码中core和javase模块介绍

zxing的源码中包含很多的模块,模块列表如下: core: The core image decoding library, and test code javase: J2SE-specific client code zxingorg: The source behind zxing.org/w zxing......

彭苏云
2013/12/17
0
0
Java 生成 / 解码 QR码

QR码的使用越来越多,可以在很多地方见着,比如火车票、推广产品上等,以下将介绍如何用Java生成QR码以及解码QR码。 1、涉及开源项目: ZXing :一个开源Java类库用于解析多种格式的1D/2D条形...

彭博
2012/07/31
6.7K
6
Java 二维码开发包 zxing 使用教程

有一个开源的 Java 类库叫做 “zxing” (Zebra Crossing),可以用来读写不同类型的条形码,包括二维码。 我测试了 zxing,它可以读取一个嵌在 100 dpi 的灰度文档中的条形码! 这篇文章讲述...

虫虫
2012/03/30
24.6K
6

没有更多内容

加载失败,请刷新页面

加载更多

Datatables插件1.10.15版本服务器处理模式ajax获取分页数据实例解析

一、问题描述 前端需要使用表格来展示数据,找了一些插件,最后确定使用dataTables组件来做。 后端的分页接口已经写好了,不能修改。接口需要传入页码(pageNumber)和页面显示数据条数(pageSi...

OSC首席混子
16分钟前
0
0
基于虹软的Android的人脸识别SDK使用测试

现在有很多人脸识别的技术我们可以拿来使用;但是个人认为还是离线端的SDK比较实用;所以个人一直在搜集人脸识别的SDK;原来使用开源的OpenCV;最近有个好友推荐虹软的ArcFace, 闲来无事就下...

是哇兴哥棒棒哒
25分钟前
0
0
Netty内存池之PoolThreadCache详解

PoolThreadCahche是Netty内存管理中能够实现高效内存申请和释放的一个重要原因,Netty会为每一个线程都维护一个PoolThreadCache对象,当进行内存申请时,首先会尝试从PoolThreadCache中申请,...

爱宝贝丶
39分钟前
10
0
除了Reader、Inbox之外 谷歌“关门部”还关闭了哪些服务或产品?

我们经常调侃称谷歌的“关门部”和微软的“更名部”是 IT 界的两大传奇,那么除了比较熟悉的 RSS 订阅服务 Google Reader、电子邮件服务 Inbox 和 Facebook 竞品 Google+ 之外,你还知道谷歌...

linux-tao
39分钟前
0
0
从B站的代码泄露事件中,我们能学到些什么?

先声明一下,本文不聊ISSUE中的七七八八,也不聊代码是否写的好,更不聊是不是跟蔡徐坤有关之类的吃瓜内容。仅站在技术人的角度,从这次的代码泄露事件,聊聊在代码的安全管理上,通常都需要...

程序猿DD
43分钟前
46
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部