实现类似qq扫一扫功能
2015-10-11 21:39
316 查看
最近公司项目需要实现一个类似qq扫一扫功能,该功能主要分为三个部分:扫一扫、扫描相册中二维码图片、开灯(我的二维码不是主要功能)
但该博客中的代码只能简单的实现扫一扫功能,周围的背景并不是半透明的。
![](http://img.blog.csdn.net/20151011212655544?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
通过以下代码可以实现中间透明,旁边半透明的效果
![](http://img.blog.csdn.net/20151011212417484?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20151011213625801?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
只需将背景图片移到视图的最上层即可(右图):
于是,开始寻找支持扫描相册中二维码图片的第三方类库,目前只有ZBar和ZXingObjC支持,而前者很久没更新,故而选择后者。
通过以下代码可以实现点击相册,选择图片,获取图片中的二维码信息。
![](http://img.blog.csdn.net/20151011212637104?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
但是,光有以上代码是不够的,在离开扫一扫界面时,如果没有关闭手电筒,手电筒一直会是开启的状态。这时,需要添加以下代码,在离开页面时,关闭手电筒。
以上三部分代码,即可完成类似qq扫一扫功能。
1.扫一扫
iOS7以后,AVFoundation.framework框架支持扫一扫功能,详细代码,可以参考http://www.jianshu.com/p/6b7d54b3f88b但该博客中的代码只能简单的实现扫一扫功能,周围的背景并不是半透明的。
通过以下代码可以实现中间透明,旁边半透明的效果
-(void)setupBgView{ self.view.backgroundColor = [UIColor blackColor]; //绘制扫一扫背景,中间透明,旁边半透明 UIGraphicsBeginImageContext(self.view.frame.size); CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSetRGBFillColor(ctx, 0,0,0,0.5); CGRect drawRect =CGRectMake(0, 0, Screen_Width, Screen_height); //draw the transparent layer CGContextFillRect(ctx, drawRect); //clear the center rect of the layer drawRect = self.scanBg.frame; CGContextClearRect(ctx, drawRect); UIImage* returnimage = UIGraphicsGetImageFromCurrentImageContext(); UIImageView * img = [[UIImageView alloc] initWithImage:returnimage]; [self.view addSubview:img]; UIGraphicsEndImageContext(); }但以上代码仍然存在一点小问题:这张背景图片是直接盖在最上层,导致扫一扫界面上的图片和文字效果不好(左图)。
只需将背景图片移到视图的最上层即可(右图):
[self.view addSubview:img]; [self.view sendSubviewToBack:img];
2.扫描相册中二维码图片
在网上寻找了很久,发现AVFoundation.framework框架并不支持扫描相册中二维码图片功能。于是,开始寻找支持扫描相册中二维码图片的第三方类库,目前只有ZBar和ZXingObjC支持,而前者很久没更新,故而选择后者。
通过以下代码可以实现点击相册,选择图片,获取图片中的二维码信息。
- (IBAction)clickPhotoAlbum:(id)sender { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.allowsEditing = YES; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentViewController:picker animated:YES completion:^{}]; } #pragma mark - UIImagePickerControllerDelegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"]; [self dismissViewControllerAnimated:YES completion:^{ [self getURLWithImage:image]; } ]; } -(void)getURLWithImage:(UIImage *)img{ UIImage *loadImage= img; CGImageRef imageToDecode = loadImage.CGImage; ZXLuminanceSource *source = [[ZXCGImageLuminanceSource alloc] initWithCGImage:imageToDecode]; ZXBinaryBitmap *bitmap = [ZXBinaryBitmap binaryBitmapWithBinarizer:[ZXHybridBinarizer binarizerWithSource:source]]; NSError *error = nil; ZXDecodeHints *hints = [ZXDecodeHints hints]; ZXMultiFormatReader *reader = [ZXMultiFormatReader reader]; ZXResult *result = [reader decode:bitmap hints:hints error:&error]; if (result) { // The coded result as a string. The raw data can be accessed with // result.rawBytes and result.length. NSString *contents = result.text; NSLog(@"contents =%@",contents); UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"解析成功" message:contents delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil]; [alter show]; } else { UIAlertView *alter1 = [[UIAlertView alloc] initWithTitle:@"解析失败" message:nil delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil]; [alter1 show]; } }但,以上代码存在一点小问题,跳转到相册后,选择一张图片,这张图片是可编辑的状态
picker.allowsEditing = YES;改为
picker.allowsEditing = NO;结果,闪退。调试发现跳转到以下代码,image为空。
UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];打印info,发现info中还有UIImagePickerControllerOriginalImage,将image该为UIImagePickerControllerOriginalImage即可。
UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
3.开灯
这里的开灯其实就是打开手电筒,手电筒也是基于AVFoundation.framework框架,通过以下代码可以实现开灯和关灯功能。- (IBAction)clickLight:(id)sender { AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if ([device hasTorch]) { [device lockForConfiguration:nil]; if(isLedOn){ //关灯 [device setTorchMode: AVCaptureTorchModeOff]; }else{ //开灯 [device setTorchMode: AVCaptureTorchModeOn]; } [device unlockForConfiguration]; } isLedOn = !isLedOn; }
但是,光有以上代码是不够的,在离开扫一扫界面时,如果没有关闭手电筒,手电筒一直会是开启的状态。这时,需要添加以下代码,在离开页面时,关闭手电筒。
-(void)viewWillDisappear:(BOOL)animated{ AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if ([device hasTorch]) { [device lockForConfiguration:nil]; [device setTorchMode: AVCaptureTorchModeOff]; [device unlockForConfiguration]; } isLedOn = NO; }
以上三部分代码,即可完成类似qq扫一扫功能。
相关文章推荐
- JUnit单元测试入门
- hdu 5463 Clarke and minecraft(水)
- 一起学CC3200之OTA方案 设计and 探讨
- sublime 3 安装
- svn提交自动更新服务器端web项目测试站点(使用svn的hooks实现)
- 从Lumia退役看为什么WP走向没落(从程序员与市场开发的角度,讲的真棒!)
- 【WEB API项目实战干货系列】- WEB API入门(一)
- Spring in Action 学习笔记三-AOP
- 移植ok6410 LCD驱动
- Collections结合Comparator实现对列表的快速排序
- Lowest Common Multiple Plus
- 17.1.1.7 Setting Up Replication with New Master and Slaves
- Binary Tree Paths
- 中国大学MOOC-陈越、何钦铭-数据结构 Root of AVL Tree
- rd如何撰写总体设计文档和详细设计文档
- Rhel7本地邮件系统,服务器和客户机都配置postfix和null client
- 软件开发工具总结
- [BZOJ1218] [HNOI2003]激光炸弹
- Windows高精度计时
- 矩阵的维数