一、 二维码
它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。
2.二维码分类
二维条码/二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码。 堆叠式/行排式二维条码形态上是由多行短截的一维条码堆叠而成;矩阵式二维条码以矩阵的形式组成,在矩阵相应元素位置上用“点”表示二进制“1”, 用“空”表示二进制“0”,“点”和“空”的排列组成代码。
二、 Zxing与ZBar
1,扫描二维码可以用Zxing或者Zbar(Zbar没有用过);Zxing这个项目中同时包含了Java和C#方面的支持,但是在iOS这块,Zxing只能扫描,不能生成;
2,ZXing可以直接扫二维码,如果要扫条形码,则需要去改改代码花点功夫了。ZBar也可以找到,但是据了解,ZBar的源码包含其他各平台的源码,代码较乱,ZBar的源码找起来比较费功夫。
3,Zxing需要注意中文的乱码问题
三、 Zxing配置问题
(1)Zxing最新下载地址是:http://code.google.com/p/zxing/downloads/list
提示:注意下载的文件是十几兆的文件,Zxing目前最新版本为Zxing-2.1,此文档还是基于Zxing-2.0来说;
(2)解压下载过来的文件,只保留“cpp”“iPhone”这两个文件夹,因为里面包含有其他开发语言的SDK,我们只需要iOS方向的文件;
(3)拷贝这个文件夹到项目的根目录下:
(4)点击"File"选择“Add filesto...”,在弹出的框中,找到:你的项目文件夹/zxing-2.0/iphone/ZXingWidget下面,选择"ZXingWidget.xcodeproj"(在添加前,先运行该项目,进行编译,如果成功,再进行此步添加!),并确保"Copy itemsinto destination group’s folder (if needed)"不被选中。然后点添加。会出现一个框框;这个框框可以理解为项目的一个工作区域;
(5)添加库文件:Build Phases->”Link
Binary With Libraries”->点击"+"。添加如下几项:
(1)libZXingWidget.a
(2)AddressBook
(3)AddressBookUI
(4)AudioToolbox
(5)AVFoundation
(6)CoreMedia
(7)CoreVideo
(8)libiconv.dylib
(6)Build Phases->Target Dependencies
(6)由于很多Zxing的代码还没有添加到我们的项目中,如文件夹“cpp”,我们需要找到他们所以我们需要添加一个路径:Build Settings-> headersearch paths(可以搜索);然后双击header search paths,点“+”
添加的路径是:(1)"../zxing-2.0/cpp/core/src/"
(2)"../zxing-2.0/iphone/ZXingWidget/Classes"(注意双引号添加上去);
(7)现在编译,会出现;找不到文件,这是因为这Zxing是和C++的混编,所以需要把 .m文件的后缀改为 .mm;
四、 ZXing二维码扫描
(1) 在项目中需要实现Zxing的delegate,所以在 .h中需要添加<ZXingDelegate>
(2) 在扫描button的响应事件中,添加一下代码
ZXingWidgetController *widController = [[ZXingWidgetControlleralloc] initWithDelegate:selfshowCancel:YESOneDMode:NO];
QRCodeReader*qrcodeReader = [[QRCodeReaderalloc] init];
NSSet *readers = [[NSSetalloc ] initWithObjects:qrcodeReader,nil];
[qrcodeReader release];
widController.readers = readers;
[readers release];
// 界面的跳转
[self presentModalViewController:widController animated:YES];
[widControllerrelease];
(3) 在跳入ZXing的建立的窗口之后,ZXing正常扫描退出后,ZXing扫描有结果,会回调
- (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result
{
self.resultsToDisplay = result;
if (self.isViewLoaded)
{
[m_resultsViewsetText:m_resultsToDisplay];
}
[self dismissModalViewControllerAnimated:NO];
}
五、 Zxing条形码扫描
Zxing扫描条形码和二维码不一样,因为二维码和条形码扫描的实现不是在同一个类中,我们需要将二维码中的:
QRCodeReader *qrcodeReader = [[QRCodeReaderalloc] init];
改为:
MultiFormatOneDReader *oneReader = [[MultiFormatOneDReaderalloc]init];
要实现条形码的扫描,同时需要修改ZXing编写的一些代码;详细请参考 Zxing条形码.doc
注释:条形码和二维码可以同时写在一个Button的Action中,
QRCodeReader *qrcodeReader = [[QRCodeReaderalloc] init];
MultiFormatOneDReader *oneReader = [[MultiFormatOneDReaderalloc]init];
NSSet *readers = [[NSSetalloc ] initWithObjects:qrcodeReader,oneReader,nil];