iphone 二维码 使用说明

转自: http://blog.csdn.net/linkai5696/article/details/6290001
1、二维码简介

二维码 (2-dimensional bar code) 是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理: 二维条码/二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息。

2、获取iphone开源代码工程

http://code.google.com/p/zxing/

下载到本地以后解压进入文件夹可以看到

iphone文件夹-->(在点击进入)

ScanTest(测试工程) 和 ZXingWidget(连接库 .a)



3、编译ZXingWidget并且在工程中调用

-------------------------------------------------------------------------------------

因为在4.0以上才有提供获取摄像头数据的类 AVCaptureDeviceInput AVCaptureVideoDataOutput类等 (这样我们在4.x上面才能自动对焦对二维码进行解码

,获取二维码的信息)



-------------------------------------------------------------------------------------



其中在ZXingWidget静态库

ZXingWidgetController.h中为我们提供了 HAS_AVFF的判断开关(默认为1)

这样的话 ZXingWidget 工程只能 选择 Base SDK 4.0

如图2

iphone 二维码 使用说明
下编译才能通过



编译完.a后那打开ScanTest工程 一样选择 Base SDK 4.0 编译工程就可以编译运行成功





其中二维码解码的调用可以详见



RootViewController.mm的文件 可以看到 方法

//此方法就是调用 调用摄像头数据自动对焦解码

- (IBAction)scanPressed:(id)sender

{

//此处代码 详见工程

}



//以下delegate 方法返回 解码结果

#pragma mark ZXingDelegateMethods

- (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result

{


}



/////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////



其实到这边为止我们已经可以编译的程序可以在4.x以上的机子运行了

但是这样只能支持4.x 这里我们难道不能支持3.x的机子码?



其实是可以的但是我们要修改添加一些代码



首先还是确保  静态库.a和调用程序 编译试在 BADE SDK 4.0



但是要在调用程序如 ScanTest中要修改工程的设置

如图3、4

iphone 二维码 使用说明

iphone 二维码 使用说明


修改完设置后然后拷贝以下的代码 替换 原来

scanPressed的方法



///////////////////////////////////////代码区/////////////////////////////////////////////////

- (IBAction)scanPressed:(id)sender {


if (NSClassFromString(@"AVCaptureSession") && NSClassFromString(@"AVCaptureVideoPreviewLayer"))

{

MLOG(@"__IPHONE_4_0");

ZXingWidgetController *widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO];

widController.view.backgroundColor = [UIColor blueColor];

QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init];

NSSet *readers = [[NSSet alloc ] initWithObjects:qrcodeReader,nil];

[qrcodeReader release];

widController.readers = readers;

[readers release];

NSBundle *mainBundle = [NSBundle mainBundle];

widController.soundToPlay =

[NSURL fileURLWithPath:[mainBundle pathForResource:@"beep-beep" ofType:@"aiff"] isDirectory:NO];

[self presentModalViewController:widController animated:YES];

[widController release];

}

else//3.x以下的固件系统*/

{

MLOG(@"__IPHONE_3_0");

UIImagePickerController *pickCtr = [[UIImagePickerController alloc] init];

pickCtr.sourceType = UIImagePickerControllerSourceTypeCamera;

pickCtr.delegate = self;

[self presentModalViewController:pickCtr animated:YES];

[pickCtr release];

}



}



#pragma mark -

#pragma mark UIImagePickerControllerDelegate

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

{


NSLog(@"info ==== %@", info);


UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];



QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init];

NSSet *readers = [[NSSet alloc ] initWithObjects:qrcodeReader,nil];

[qrcodeReader release];



CGRect cropRect = [UIScreen mainScreen].applicationFrame;



Decoder *d = [[Decoder alloc] init];

d.readers = readers;

d.delegate = self;


int res = [d decodeImage:image];


MLOG(@"res === %d", res);

[d release];

[self dismissModalViewControllerAnimated:YES];

}





- (void)decoder:(Decoder *)decoder didDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset withResult:(TwoDDecoderResult *)twoDResult {

MLOG(@"twoDResult text ==== %@", [twoDResult text]);


UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[twoDResult text] message:[twoDResult text] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

[alertView show];

[alertView release];

}



- (void)decoder:(Decoder *)decoder failedToDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset reason:(NSString *)reason {

MLOG(@"twoDResult text ==== failedToDecodeImage");

decoder.delegate = nil;

}



///////////////////////////////////////代码区/////////////////////////////////////////////////



这样在4.0编译完以后就可以自动识别机子固件调用不同的解码方式了

其中 在4.0以上的我们试自动对焦解码二维码



你可能感兴趣的:(iPhone)