欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-22 09:15:09
文章重点介绍如何解决,从手机相册中读取条形码和二维码的问题 1.扫码. 网上有特别的关于ios扫码的代码和示例,其中扫码主要使用的是自带的avfoundation类.这...

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

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文件夹导入,如图

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

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

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

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

#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 条码及二维码扫描(从相册中读取条形码/二维码)及扫码过程中遇到的坑,希望对大家有所帮助

上一篇:

下一篇: