博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]【基于zxing的编解码实战】精简Barcode Scanner篇
阅读量:5858 次
发布时间:2019-06-19

本文共 3515 字,大约阅读时间需要 11 分钟。

通过的分析,现在可以实现最终目标了:精简Barcode Scanner并将其中的编码和解码分离为两个独立的部分,方便日后快速集成到自己的项目中去。

编码

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

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

精简过后该项目起名为XBarcodeGenerator

可以实现的功能包括:

  • 分享联系人

  • 分享剪切板

  • 编码输入文本

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

解码

在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之前被调用,在预览界面展示出来后设置是无效的。

参考:

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();		}	}...

如果要仿照微信做一个扫描窗口,可参考

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

转载地址:http://ugojx.baihongyu.com/

你可能感兴趣的文章
js兼容性大全
查看>>
晶振不起振的原因及其解决方法
查看>>
学习目标
查看>>
《利用python进行数据分析》学习笔记--数据聚合与分组(groupby)
查看>>
C++中的函数指针模板
查看>>
2015年个人总结
查看>>
C#编程(六)------------枚举
查看>>
高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-2 发布
查看>>
ZOJ 3316 Game 一般图最大匹配带花树
查看>>
《系统架构师》——操作系统和硬件基础
查看>>
如何看待一本图书
查看>>
angularjs1-7,供应商
查看>>
oracle参数列表
查看>>
Wordpress3.2去除url中的category(不用插件实现)
查看>>
The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine-Excel2003
查看>>
《Java 2 图形设计卷Ⅱ- SWING》第12章 轻量容器
查看>>
macOS Sierra 代码显示未来 Mac 将搭载 ARM 芯片
查看>>
《Arduino家居安全系统构建实战》——1.3 部署安全系统的先决条件
查看>>
Linux 中如何通过命令行访问 Dropbox
查看>>
《jQuery移动开发》—— 1.3 小结
查看>>