基于Android的二维码的生成与识别系统的设计与实现
2012-04-29马鸣李海波
马鸣 李海波
摘要:随着二维码的广泛应用和Android智能手机的进一步普及,该文介绍了一个通过Android平台下的摄像和绘图功能,利用二维码的编码和解码原理,通过Android手机对二维码的数据进行解析和编码,实现对二维码生成和识别系统。该系统内容包括两部分:二维条码的生成系统设计和二维条码的识别系统设计。生成系统完成了从输入数据到生成相应二维码的功能,识别系统完成对采集到的二维码符号进行译码还原出所携带信息的功能。
关键词:二维码;二维码生成;二维码识别;Android平台
中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)26-6353-04
Design and Realization of the QR Code Generation and Recognition System Based on Android
MA Ming1, LI Hai-bo2
(Nanyang Institute of Technology, Nanyang 473004, China)
Abstract: Along with the wide application of QR Code and Android smart phones further popularity. This paper introduces a camera and drawing function in the Android workbench. Using of QR Code encoding and decoding principle, through the An? droid mobile phone resolve and code planar barcode to realize the QR Code identification and generate system. The content of this project includes the design of creation and recognition. The creation system completes the process from the input data to QR Code,and the recognition system completes the process of translating QR Code to relevant information.
Key words: QR Code; The generation of QR Code; The recognition of QR Code; The Android Platform
一维条码自出现以来,由于受信息容量的限制,不得不依赖数据库的存在。在没有数据库和不联网的地方,一维条码的使用受到了较大的限制。另外,要用一维条码表示汉字的场合,显得十分的不方便,且效率低下。
二维码的出现是为了解决一维条码无法解决的问题而产生。因而它具有高密度、高可靠性等特点,所以可以用它表示数据文件(包括汉字文件)、图像等。二维码是大容量、高可靠性信息实现存储、携带并自动适读的最理想的方法。手机二维码的业务类型主要有两种:一是识读,就是借助应用软件直接读出码上信息,它可以衍生出上网浏览、电子购物等多种应用;二是被读,就是由商家向手机用户发送二维码信息,通过设备识读,可作身份识别、电子凭证等之用。
1系统相关技术分析
1.1 Android系统架构
Android是一种以Linux为基础的开放源代码操作系统,主要使用于便携设备。Android的系统架构采用了分层的架构。android分为四个层,分别是应用程序层、应用程序框架层、系统运行库层和 linux内核层。随着Android的快速发展,如今已允许开发者使用多种编程语言来开发Android应用程序,而不再是以前只能使用Java开发Android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统[1]。
1.2开发环境
系统主要分为两个大的模块:二维码的生成和二维码的识别。二维码的生成主要就是基于 Winnows上的开发工具Netbeans开发,而同时又开发一个在Android平台下的二维码生成。而二维码的识别主要就是基于Android平台来开发,主要就是运用Android SDK和Eclipse共同开发,但是环境需要搭建。
二维码的生成主要设计的是在电脑上运行的桌面程序。通过在电脑上开发一个Java程序来生成二维码。其开发环境主要如表1。
二维码的识别和生成是在Android平台上的开发的,并使用Eclipse IDE工具进行开发的。Eclipse IDE安装ADT插件搭建了很好的Android开发平台,方便与编程。至于识别的功能要用到摄像头,虚拟机上面是没有摄像头的,这就需要有真机进行二维码的识别测试。Android平台开发环境如下表:
2系统的设计
2.1系统框架设计
本系统框架结构主要分成生成和识别两大部分。
识别功能主要就是对二维码和条形码的识别。主要就是通过手机的摄像头对二维码或者是条形码进行扫描,然后把把扫描到的二维码或者是条形码送到后台进行解析,如果解析成功后,就不再进行扫描。如果解析不成功,就会在进行扫描采集图像,在传到后台解析,直到能够识别图像为止[2]。
生成功能主要就是对二维码的生成。而生成这个功能可以在电脑上运行生成,也可以在手机上运行生成。二维码的生成主要支持名片、短信、文本、电子邮件及网络书签的生成。当用户选择好多要生成的对象时,就会把用户输入的信息送到后台,通过调用解析包,来生成还有相应信息的二维码。
2.2二维码的生成设计
二维码的生成,支持多种形式内容的二维码生成。所以用户要先进行选择要生成的类型,当选择类型以后,系统将转入到多选该类型的生成界面给用户,用户将相应的信息填写完成,点击生成二维码,会跳转到生成界面,显示生成的二维码[3]。
2.3二维码的识别设计
二维码的识别主要是通过对摄像头的调用,启用多线程,对摄像头进行快速的回调应用,当一次回调的图像没有识别出来就进行下一次的回调,直到识别出二维码为止[4]。同时由于对与二维码的大小不同,显示的模糊度不同等等原因,会使摄像头不能很好的采集图像,在这里要使摄像头能够进行自动对焦,从而使识别更快的实现。当识别完成以后就对用户进行提醒,对手机进行震动和播放声音,播放完成,显示识别出来的结果。
3系统的实现
3.1二维码生成的实现
二维码的生成主要是靠官方相应的编码包,将用户输入字符转换成二维数组,然后根据二维码的编码规范,使用绘图功能将二维码进行绘制。二维码的生成主要分为名片、短信、文本、电子邮件、网络书签的生成。需要有相应的框架使程序与用户进行交互,使用户有选择自己想要生成的类型,然后就是用户将自己想编辑的信息输入到系统内,系统应该提供相应的交互界面给用户输入[5]。该功能具体代码如下:
public void QREncode(String strEncoding, int qrcodeVersion)
{c.swetake.util.Qrcode testQrcode = new c.swetake.util.Qrcode();
testQrcode.setQrcodeErrorCorrect(M);
testQrcode.setQrcodeEncodeMode(B);
testQrcode.setQrcodeVersion(qrcodeVersion);
byte[] bytesEncoding = strEncoding.getBytes("utf-8");
if (bytesEncoding.length > 0) {
boolean[][] bEncoding = testQrcode.calQrcode(bytesEncoding);
drawQRCode(bEncoding, getResources().getColor(R.drawable.black));}
}
//绘制条形码
private void drawQRCode(boolean[][] bRect, int colorFill) {
int intPadding = 20;
Canvas mC = mSurfaceHolder01.lockCanvas();
mC1.drawColor(getResources().getColor(R.drawable.white));
Paint mP = new Paint();
mP1.setStyle(Paint.Style.FILL);
mP.setColor(colorFill);
mP1.setStrokeWidth(1.0F);
for (int i = 0; i < bRect.length; i++) {
for (int j = 0; j < bRect.length; j++) {
if (bRect[j][i]) {
mC.drawRect(new Rect(intPadding + j * 3 + 2,
intPadding + i * 3 + 2, intPadding + j * 3 + 2 + 3,
intPadding + i * 3 + 2 + 3), mP1);
}
}
} mSurfaceHolder01.unlockCanvasAndPost(mC1);
}
3.2二维码识别的实现
系统在手机上实现图像的采集是重要的一步,在Android平台上,是使用Camera类来完成摄像头的调用和图像采集使用Camera mCamera = Camer-a. open ()获得Camera的实例,然后使用Camer-a.Parameters来设置获得图像的大小,最后通过实现Camera. Preview-Callback的接口onPreviewFrame( byte[]data,Camera camera)来获得摄像头的图像数据data。
为能够较快地获得清晰的图像,提高识别速度,文中使用了自动对焦技术。另外还应该对对焦进行定时操作,这就需要设置一个定时器对自动对焦进行定时调用。
后台对摄像头传过来的图像数据data进行解码处理,如果能够解析出来,则上面的对焦调用,摄像头回传图像数据调用等将暂停。如果解析不成功,则继续轮回调用。节约解析的时间[6]。
后台对摄像头传过来的图像数据data进行解码处理,如果能够解析出来,则上面的对焦调用,摄像头回传图像数据调用等将暂停。如果解析不成功,则继续轮回调用。节约解析的时间。主要实现代码如下:
public void handleMessage(Message message) {
switch (message.what) {
case R.id.auto_focus:
if (state == State.PREVIEW) {
CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
}
break;
case R.id.restart_preview:
Log.d(TAG, "Got restart preview message");
restartPreviewAndDecode();
break;
case R.id.decode_succeeded:
Log.d(TAG, "Got decode succeeded message");
state = State.SUCCESS;
Bundle bundle = message.getData();
Bitmap barcode = bundle == null ? null : (Bitmap) bundle
.getParcelable(DecodeThread.BARCODE_BITMAP);
activity.handleDecode((Result) message.obj, barcode);
break;
case R.id.decode_failed:
state = State.PREVIEW;
CameraManager.get().requestPreviewFrame(decodeThread.getHandler(),
R.id.decode);
break;
case R.id.return_scan_result:
Log.d(TAG, "Got return scan result message");
activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
activity.finish();
break;
case R.id.launch_product_query:
Log.d(TAG, "Got product query message");
String url = (String) message.obj;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
activity.startActivity(intent);
break;
}
}
4结束语
本课题的研究目的是实现二维条码的生成与识别系统设计,设计内容包括两部分:二维条码的生成系统设计和二维条码的识别系统设计。生成系统完成了从输入数据到生成相应二维码的功能,识别系统完成对图像的自动采集和数据编码解析。
参考文献:
[1]杨丰盛.Android应用开发揭秘[M].北京:机械工业出版社,2010:48-50.
[2]刘宁钟,杨静宇.基于傅里叶变换的二维条码识别[J].中国图像图形学报,2011,18(2):45-46.
[3]肖翔,刘晓明,王云柯. QR码图像的矫正与定位方法研究[J].计算机科学,2007,23(2):18-20.
[4]谷晓琳,黄明,戚海英.基于遗传算法的二维QR码图像识别[J].大连铁道学院学报,2005,12(3):35-38.
[5]王文豪,张亚红,全银,等.QRCode二维条码的图形识别技术[J].计算机技术与发展,2009,8(2):40-43.
[6]梁凤梅.快速识读QRCode码[J].电脑开发与应用,2002,12(2):50-55.