zoukankan      html  css  js  c++  java
  • iOS 条码及二维码扫描(从相册中读取条形码/二维码) 以及扫码遇到的问题

    1.扫码. 网上有特别的关于iOS扫码的代码和示例,其中扫码主要使用的是自带的AVFoundation类.这里就不细说了,要注意的是如何设置扫描区域,识别区域(这个值是按比例0~1设置,而且X、Y要调换位置,width、height调换位置)

    1. <span style="font-size:14px;">//创建输出流  
    2. AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];  
    3.   
    4. //设置识别区域 (这个值是按比例0~1设置,而且X、Y要调换位置,width、height调换位置)  
    5.     output.rectOfInterest = CGRectMake(Y /ScreenHeight, X /ScreenWidth, height /ScreenHeight, width /ScreenWidth)</span>  

       2. 获取相册中的二维码图片,用CIDetector类,但是这个类只能识别二维码图片,条形码目前暂不支持
    1. <span style="font-size:14px;">//要实现两个代理方法  
    2. <UIImagePickerControllerDelegate,UINavigationControllerDelegate>  
    3. </span>  
    1. <span style="font-size:14px;">-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info  
    2. {  
    3.     // 创建探测器 CIDetectorTypeQRCode  
    4.     CIDetector *detector = [CIDetector detectorOfType: CIDetectorTypeText context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyLow}];  
    5.         [picker dismissViewControllerAnimated:YES completion:^{  
    6.          
    7.         }];  
    8.       
    9.     // 取出选中的图片  
    10.     UIImage *pickImage = info[UIImagePickerControllerOriginalImage];  
    11.       
    12.     // 设置数组,放置识别完之后的数据  
    13.     NSArray *features = [detector featuresInImage:[CIImage imageWithData:UIImagePNGRepresentation(pickImage)]];  
    14.       
    15.     // 判断是否有数据(即是否是二维码)  
    16.     if (features.count >= 1) {  
    17.           
    18.         // 取第一个元素就是二维码所存放的文本信息  
    19.         CIQRCodeFeature *feature = features[0];  
    20.         NSString *scannedResult = feature.messageString;  
    21.           
    22.         // 触发回调  
    23.         [self getScanDataString:scannedResult];  
    24.     }else{  
    25.         [self getScanDataString:@"未识别图片中的二维码"];  
    26.     }  
    27. }</span>  

     用CIDetector类读取相册中的二维码遇到的问题是手机截屏的图片可以读取成功,手机拍照的图片取出成功率比较低。并且不支持读取条形码。

    解决办法:读取相册中的二维码/条形码,使用ZBarSDK,下面介绍一下怎么在工程中引入ZBarSDK,因为我的Demo工程没有使用CocoaPods去管理第三方库,所以介绍手动将ZBarSDK导入工程并配置。

    步骤一.在工程中建一个Frameworks文件夹将ZBarSDK文件夹导入,如图

    步骤二.在工程中添加依赖库,如图:


     

    步骤三.导入头文件并调用对应方法。

    #import "ZBarSDK.h"

     

    1. - (void)getQRcodeImage {  
    2.       
    3.     // ZBarsSDK 初始化  
    4.   
    5.     ZBarReaderController *imagePicker = [ZBarReaderController new];  
    6.       
    7.     imagePicker.showsHelpOnFail = NO; // 禁止显示读取失败页面  
    8.     imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
    9.     imagePicker.delegate = self;  
    10.     imagePicker.allowsEditing = YES;  
    11.     [self presentViewController:imagePicker animated:YES completion:nil];  
    12. }  
    13.   
    14. /** 
    15.  *  选中图片的回调 
    16.  */  
    17. -(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info  
    18. {  
    19.     id<NSFastEnumeration> results = [info objectForKey:ZBarReaderControllerResults];  
    20.       
    21.     ZBarSymbol *symbol = nil;  
    22.       
    23.     for(symbol in results) {  
    24.           
    25.         break;  
    26.     }  
    27.       
    28.     [picker dismissViewControllerAnimated:YES completion:^{  
    29.           
    30.         //二维码字符串  
    31.         NSString *QRCodeString =  symbol.data;  
    32.           
    33.         // 触发回调  
    34.         [self getScanDataString:QRCodeString];  
    35.           
    36. }];  
    37. }  
    38.   
    39. /** 
    40.  *  读取二维码/条码失败的回调 
    41.  */  
    42. -(void)readerControllerDidFailToRead:(ZBarReaderController *)reader withRetry:(BOOL)retry{  
    43.       
    44.     if (retry) { //retry == 1 选择图片为非二维码。  
    45.         [self dismissViewControllerAnimated:YES completion:^{  
    46.               
    47.             [self getScanDataString:@"未发现二维码/条码"];  
    48.         }];  
    49.           
    50.     }  
    51.     return;  
    52.       
    53. }

     分享ZBarSDK的下载地址

  • 相关阅读:
    e667. 在给定图像中创建缓冲图像
    e661. 确定图像中是否有透明像素
    e673. Getting Amount of Free Accelerated Image Memory
    e663. 在gif图像中获取透明和色彩的数量
    e662. 取的图像的色彩模型
    e675. 翻转缓冲图像
    e665. 在图像中过滤三元色
    e679. 浮雕化图像
    e669. 绘制缓冲图像
    e664. 在图像中获取子图像
  • 原文地址:https://www.cnblogs.com/pioneerMax/p/6394232.html
Copyright © 2011-2022 走看看