当前位置:主页 > 移动开发 > iOS代码 >

iOS 条码及二维码扫描(从相册中读取条形码/二维码)及扫码过程中遇到的坑

时间:2021-04-01 08:17:31 | 栏目:iOS代码 | 点击:

文章重点介绍如何解决,从手机相册中读取条形码和二维码的问题

1.扫码.

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

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

2. 获取相册中的二维码图片,用CIDetector类,但是这个类只能识别二维码图片,条形码目前暂不支持

<span style="font-size:14px;">//要实现两个代理方法 
<UIImagePickerControllerDelegate,UINavigationControllerDelegate> 
</span> 
[objc] view plain copy 在CODE上查看代码片派生到我的代码片
<span style="font-size:14px;">-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
  // 创建探测器 CIDetectorTypeQRCode 
  CIDetector *detector = [CIDetector detectorOfType: CIDetectorTypeText context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyLow}]; 
    [picker dismissViewControllerAnimated:YES completion:^{ 
    }]; 
  // 取出选中的图片 
  UIImage *pickImage = info[UIImagePickerControllerOriginalImage]; 
  // 设置数组,放置识别完之后的数据 
  NSArray *features = [detector featuresInImage:[CIImage imageWithData:UIImagePNGRepresentation(pickImage)]]; 
  // 判断是否有数据(即是否是二维码) 
  if (features.count >= 1) { 
    // 取第一个元素就是二维码所存放的文本信息 
    CIQRCodeFeature *feature = features[0]; 
    NSString *scannedResult = feature.messageString; 
    // 触发回调 
    [self getScanDataString:scannedResult]; 
  }else{ 
    [self getScanDataString:@"未识别图片中的二维码"]; 
  } 
}</span>

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

解决办法:

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

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

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

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

#import "ZBarSDK.h"
/<span style="font-size:18px;">** 
 * 获取相册中的二维码图片 
 */ 
- (void)getQRcodeImage { 
  // ZBarsSDK 初始化 
  ZBarReaderController *imagePicker = [ZBarReaderController new]; 
  imagePicker.showsHelpOnFail = NO; // 禁止显示读取失败页面 
  imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
  imagePicker.delegate = self; 
  imagePicker.allowsEditing = YES; 
  [self presentViewController:imagePicker animated:YES completion:nil]; 
} 
/** 
 * 选中图片的回调 
 */ 
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
  id<NSFastEnumeration> results = [info objectForKey:ZBarReaderControllerResults]; 
  ZBarSymbol *symbol = nil; 
  for(symbol in results) { 
    break; 
  } 
  [picker dismissViewControllerAnimated:YES completion:^{ 
    //二维码字符串 
    NSString *QRCodeString = symbol.data; 
    // 触发回调 
    [self getScanDataString:QRCodeString]; 
}]; 
} 
/** 
 * 读取二维码/条码失败的回调 
 */ 
-(void)readerControllerDidFailToRead:(ZBarReaderController *)reader withRetry:(BOOL)retry{ 
  if (retry) { //retry == 1 选择图片为非二维码。 
    [self dismissViewControllerAnimated:YES completion:^{ 
      [self getScanDataString:@"未发现二维码/条码"]; 
    }]; 
  } 
  return; 
}</span> 

这样就可以成功的读取手机相册中的条形码和二维码图片了。

分享ZBarSDK的下载地址

您可能感兴趣的文章:

相关文章