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

 更新时间:2017年01月04日 13:43:08   作者:四分之一工程师  
本文主要给大家介绍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的下载地址

以上所述是小编给大家介绍的iOS 条码及二维码扫描(从相册中读取条形码/二维码)及扫码过程中遇到的坑,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • iOS版微信朋友圈识别图片位置信息 如何实现?

    iOS版微信朋友圈识别图片位置信息 如何实现?

    这篇文章主要为大家详细介绍了iOS版微信朋友圈识别图片位置信息的实现方法
    2016-10-10
  • Mac OS自带了apache基本用法总结

    Mac OS自带了apache基本用法总结

    这篇文章主要介绍了Mac OS自带了apache基本用法总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • iOS开发避免安全隐患的要点总结

    iOS开发避免安全隐患的要点总结

    在本篇文章里小编给各位整理了关于iOS开发如何避免安全隐患的知识点总结,需要的朋友们学习下。
    2019-07-07
  • ios端ijkplayer编译教程

    ios端ijkplayer编译教程

    下面小编就为大家分享一篇ios端ijkplayer编译教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • iOS自定义日历控件的简单实现过程

    iOS自定义日历控件的简单实现过程

    这篇文章主要为大家详细介绍了iOS自定义日历控件的简单实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • IOS setOnclick点击事件分析

    IOS setOnclick点击事件分析

    本篇文章给大家整理了IOS setOnclick点击事件完美扩展的相关知识点以及代码实例,有需要的朋友可以跟着测试学习下。
    2018-05-05
  • iOS应用程序中通过dispatch队列控制线程执行的方法

    iOS应用程序中通过dispatch队列控制线程执行的方法

    Grand Central Dispatch简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统,iOS应用程序中通过dispatch队列控制线程执行则是以并发来达到多核优化的重要途径.
    2016-05-05
  • iOS中的类、元类以及isa示例详解

    iOS中的类、元类以及isa示例详解

    从初学OC的时候就听人提起过OC对象中的isa指针,用来指向对象所属的类,从而可以在调用方法时通过isa指针找到相应的方法和属性,下面这篇文章主要给大家介绍了关于iOS中类、元类以及isa的相关资料,需要的朋友可以参考借鉴,下面来一起学习学习吧。
    2018-01-01
  • iOScollectionView广告无限滚动实例(Swift实现)

    iOScollectionView广告无限滚动实例(Swift实现)

    本篇文章主要介绍了iOScollectionView广告无限滚动实例,可以实现广告无限滚动,有兴趣的可以了解一下。
    2016-11-11
  • iOS开发技能weak和strong修饰符的规范使用详解

    iOS开发技能weak和strong修饰符的规范使用详解

    这篇文章主要为大家介绍了iOS开发技能weak和strong修饰符的规范使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论