前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ios zxing扫码问题

ios zxing扫码问题

作者头像
xiangzhihong
发布于 2018-02-05 06:22:43
发布于 2018-02-05 06:22:43
2.3K00
代码可运行
举报
文章被收录于专栏:向治洪向治洪
运行总次数:0
代码可运行

ios 中 扫瞄二维码,条形码基本有 2中第三方的库,一个是zbar 一个是zxing,zxing 在android中表现的比较出色,但是在ios 中不是很好用,扫瞄效率低,我们一般都用zbar,但是有些 条形码就是很奇葩,用zbar无法识别,下面就是一种

 我用了好多ios 的app 都无法识别, 《我查查》,《快拍二维码》,《微信》,自己用zbar都不行,最后用android 手机轻松扫瞄ok,哪我知道为什么了,是zxing可以搞定这种条形码。马上就换了zxing 来测试。 去github 找到了 zxing 的demo。但是悲剧的时无法识别各种条形码。

而且工程还报错。

  报Private field 'cached_y_' not used 编译通不过,解决办法就是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
删除工程“buliding setting”的"Other Warning Flags"  的后面的参数:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"-Werror""-Wno-unused-parameter"  等等

  然后真机debug 完全ok,但是还是无法扫瞄 条形码!为什么呢?

  我在网上着了下原因 ,问题解决了。

方法是:

 1.修改 OverlayView.m文件中的61行左右

注释掉下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// self.oneDMode = isOneDModeEnabled;  

2.在ZXingWidgetController.m中用这个函数替换以前的函数

 也就是上面红色的部分做了修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)captureOutput:(AVCaptureOutput *)captureOutput   
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer   
       fromConnection:(AVCaptureConnection *)connection   
{  
  if (!decoding) {  
    return;  
  }  
  CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);   
  /*Lock the image buffer*/  
  CVPixelBufferLockBaseAddress(imageBuffer,0);   
  /*Get information about the image*/  
  size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);   
  size_t width = CVPixelBufferGetWidth(imageBuffer);   
  size_t height = CVPixelBufferGetHeight(imageBuffer);   
      
  uint8_t* baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);   
  void* free_me = 0;  
  if (true) { // iOS bug?  
    uint8_t* tmp = baseAddress;  
    int bytes = bytesPerRow*height;  
    free_me = baseAddress = (uint8_t*)malloc(bytes);  
    baseAddress[0] = 0xdb;  
    memcpy(baseAddress,tmp,bytes);  
  }  
  
  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();   
  CGContextRef newContext =  
    CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace,  
                          kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst);   
  
  CGImageRef capture = CGBitmapContextCreateImage(newContext);   
  CVPixelBufferUnlockBaseAddress(imageBuffer,0);  
  free(free_me);  
  
  CGContextRelease(newContext);   
  CGColorSpaceRelease(colorSpace);  
  
  CGRect cropRect = [overlayView cropRect];  
  if (oneDMode) {  
    // let's just give the decoder a vertical band right above the red line  
<span style="color:#ff0000;">//    cropRect.origin.x = cropRect.origin.x + (cropRect.size.width / 2) - (ONE_D_BAND_HEIGHT + 1);  
//    cropRect.size.width = ONE_D_BAND_HEIGHT;  
//    // do a rotate  
//    CGImageRef croppedImg = CGImageCreateWithImageInRect(capture, cropRect);  
//    CGImageRelease(capture);  
//    capture = [self CGImageRotated90:croppedImg];  
//    capture = [self CGImageRotated180:capture];  
//    //              UIImageWriteToSavedPhotosAlbum([UIImage imageWithCGImage:capture], nil, nil, nil);  
//    CGImageRelease(croppedImg);  
//    CGImageRetain(capture);  
//    cropRect.origin.x = 0.0;  
//    cropRect.origin.y = 0.0;</span>  
    cropRect.size.width = CGImageGetWidth(capture);  
    cropRect.size.height = CGImageGetHeight(capture);  
  }  
  
  // N.B.  
  // - Won't work if the overlay becomes uncentered ...  
  // - iOS always takes videos in landscape  
  // - images are always 4x3; device is not  
  // - iOS uses virtual pixels for non-image stuff  
  
  {  
    float height = CGImageGetHeight(capture);  
    float width = CGImageGetWidth(capture);  
  
    CGRect screen = UIScreen.mainScreen.bounds;  
    float tmp = screen.size.width;  
    screen.size.width = screen.size.height;;  
    screen.size.height = tmp;  
  
    cropRect.origin.x = (width-cropRect.size.width)/2;  
    cropRect.origin.y = (height-cropRect.size.height)/2;  
  }  
  CGImageRef newImage = CGImageCreateWithImageInRect(capture, cropRect);  
  CGImageRelease(capture);  
<span style="color:#ff0000;"> // UIImage *scrn = [[UIImage alloc] initWithCGImage:newImage];  
    int backCameraImageOrientation = UIImageOrientationRight;  
    UIImage *scrn = [[UIImage alloc] initWithCGImage:newImage scale:  
                     (CGFloat)1.0 orientation:backCameraImageOrientation];  
</span>  
  CGImageRelease(newImage);  
  Decoder *d = [[Decoder alloc] init];  
  d.readers = readers;  
  d.delegate = self;  
  cropRect.origin.x = 0.0;    
  cropRect.origin.y = 0.0;  
  decoding = [d decodeImage:scrn cropRect:cropRect] == YES ? NO : YES;  
  [d release];  
  [scrn release];  
}   

3.在ViewController.mm 文件中做下面的修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import "MultiFormatOneDReader.h"  
  
- (void)pressButton1:(UIButton *)button  
{  
  <span style="color:#ff0000;">  ZXingWidgetController *widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:YES];  
    NSMutableSet *readers = [[NSMutableSet alloc] init];  
    QRCodeReader *qrcodeReader = [[QRCodeReader alloc] init];  
  
    MultiFormatOneDReader *OneReaders=[[MultiFormatOneDReader alloc]init];  
   
    [readers addObject:qrcodeReader];  
     [readers addObject:OneReaders];</span>  
    widController.readers = readers;  
    [self presentViewController:widController animated:YES completion:^{}];  
}  

然后修改全部ok了,扫瞄条形码就完全ok了。

 看效果:

 二:

三:

四:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-10-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
最新版基于ZXing的Android扫码库
ZXingLite for Android 是ZXing的精简极速版,基于ZXing库优化扫码和生成二维码/条形码功能,扫码界面完全支持自定义,也可一行代码使用默认实现的扫码功能。总之你想要的都在这里。
xiangzhihong
2023/04/01
6.1K1
iOS 中的CIFilter(基础用法)
本文大部分内容均来自:Core Image Tutorial: Getting Started Core Image 是一个很强大的库,PS图片时用到的各种滤镜就是在这个库中。而我们创建二维码、创建条形码用这里的滤镜,只需要短短几行代码就可以撸出来(后面会讲怎么用CIFilter绘制二维码、条形码)。 文中有提到在iOS 8 上,CIFilter 的API 里有126种滤镜可用,在 同时期 Mac OS 上有160多种滤镜可用;而在iOS 9.3 上,我测试可以使用的滤镜已经达到174种,Mac OS上肯定更多咯。
Haley_Wong
2018/08/22
2.2K0
iOS 中的CIFilter(基础用法)
AFNetworking框架分析(五)——响应的序列化AFURLResponseSerialization分析
这一篇将分析网络请求收到数据时的响应AFURLResponseSerialization序列化过程。 当AFURLRequestSerialization类将所有的请求数据处理完成发送请求之后,当收到返回的数据信息时,这时就要靠AFURLResponseSerialization类来完成不同类型返回数据的序列化操作。 从AFURLResponseSerialization头文件中,可以看出与AFURLRequestSerialization类的结构非常相似。从上往下,首先声明了AFURLResponseSerialization协议,协议中只有一个方法,将response解码成指定的相关数据,这是所有响应类都需要遵循的协议。之后声明了一个AFHTTPResponseSerializer类,作为响应类的根类。再往下的类,都是继承自AFHTTPResponseSerializer的子类,分别是AFJSONResponseSerializer(JSON格式数据响应,默认)、AFXMLParserResponseSerializer(iOS端XML数据解析响应)、AFXMLDocumentResponseSerializer(MAC OS端XML数据解析响应)、AFPropertyListResponseSerializer(PList格式数据解析响应)、AFImageResponseSerializer(图片数据解析响应)和AFCompoundResponseSerializer(复合式数据解析响应) 在父类AFHTTPResponseSerializer中,遵循的协议方法不做任何事情 只做一次response的验证。实现方法中,只有[self validateResponse:(NSHTTPURLResponse *)response data:data error:error]验证response是否合规的方法。而且初始化init方法中,父类只是设置编码格式为UTF-8,设置http状态码为200-299,表示只有这些状态码获得了有效的响应,而不在接受范围内的状态码和内容类型会在数据解析时发生错误。而且其中一句代码self.acceptableContentTypes = nil;,本身acceptableContentTypes用于设置可接受的contentType,这里置为nil,也从侧面建议不要直接使用父类。
我只不过是出来写写代码
2019/04/02
1.6K1
AFNetworking框架分析(五)——响应的序列化AFURLResponseSerialization分析
【IOS开发高级系列】异步绘制专题
用CGImageCreateCopy 或者CGImageCreateCopyWithColorSpace函数拷贝
江中散人_Jun
2022/03/08
1.6K0
【IOS开发高级系列】异步绘制专题
基于zxing的二维码扫描
现在的应用中二维码扫描已经成为一个应用必不可少的功能,现在大部分Android二维码扫描都是基于zxing和Zbar,这文章就来介绍一下基于zxing的二维码扫描。先看下效果图
g小志
2018/09/11
4.2K0
基于zxing的二维码扫描
iOS AVDemo(7):视频采集,视频系列来了丨音视频工程示例
iOS/Android 客户端开发同学如果想要开始学习音视频开发,最丝滑的方式是对音视频基础概念知识有一定了解后,再借助 iOS/Android 平台的音视频能力上手去实践音视频的采集 → 编码 → 封装 → 解封装 → 解码 → 渲染过程,并借助音视频工具来分析和理解对应的音视频数据。
关键帧
2022/06/13
9420
iOS AVDemo(7):视频采集,视频系列来了丨音视频工程示例
iOS:AVCaptureSession 通过摄像头获取某一帧的画面
1.配置plist 2.上代码 // // ViewController.m // newface // // Created by xc on 2018/8/27. // Copyright
菜菜不吃蔡
2018/09/19
3K0
iOS:AVCaptureSession 通过摄像头获取某一帧的画面
iOS Bluetooth 打印小票(二)
在上一篇中介绍了打印小票所需要的命令,这一篇介绍Bluetooth连接蓝牙和打印小票的全过程。
Haley_Wong
2018/08/22
3.4K0
iOS Bluetooth 打印小票(二)
【IOS开发基础系列】SDWebImageDownloader专题
        SDWebImage是一个很厉害的图片缓存的框架。既ASIHttp+AsyncImage之后,我一直使用AFNetworking集成的UIImageView+AFNetworking.h,但后者对于图片的缓存实际应用的是NSURLCache自带的cache机制。而NSURLCache每次都要把缓存的raw  data 再转化为UIImage,就带来了数据处理和内存方面的更多操作。具体的比较在这里。
江中散人_Jun
2023/10/16
9040
【IOS开发基础系列】SDWebImageDownloader专题
iOS7自带扫描二维码、条形码功能实现引1、准备工作2、实现扫描界面3、优化扫描界面
随着二维码的普及,扫码功能越来越重要,比起手动输入,扫码直接获取的方式会更加的便捷和快速,在iOS7之前,实现扫码一般是使用第三方的类库,如ZBar等,iOS7之后开始自行提供扫码的框架,在AVFoundation中包含有实现扫码的类,使用起来还是很方便的,本文通过一个例子讲述其用法。
Cloudox
2021/11/23
9900
iOS7自带扫描二维码、条形码功能实现引1、准备工作2、实现扫描界面3、优化扫描界面
iOS界面黑白实现
a. 针对图片的处理:大部分图片的显示都是最后都是调用UIImageView的setImage方法,所以hook这个方法,在显示前生成灰色的图片,然后在赋值,代码如下:
莫空9081
2022/12/12
1.6K0
ZXing 生成、解析二维码图片的小示例
静默虚空
2018/01/05
2.3K0
iOS高斯模糊&毛玻璃效果开发探索
在 iOS上怎样快速实现图片高斯模糊?iOS开发中有的时候需要将图片设置模糊,来实现特定的效果获取更好的用户体验, iOS7之后半透明模糊效果得到大范围使用的比较大,现在也可以看到很多应用局部用到了图片模糊效果,可以通过高斯模糊和毛玻璃效果达到图片模糊效果。
开发者技术前线
2020/11/23
4.9K0
iOS高斯模糊&毛玻璃效果开发探索
【教程】autojs使用zxing扫描条形码和二维码实现烟草价格扫码查询
apk体验下载链接:https://xfxuezhang.lanzouo.com/izWFA1ofrl3c
小锋学长生活大爆炸
2024/02/23
6690
【教程】autojs使用zxing扫描条形码和二维码实现烟草价格扫码查询
iOS开发——系统原生的二维码扫描
对于现在的App应用来说,扫描二维码这个功能是再正常不过的一个功能了,在早期开发这些功能的时候,大家或多或少的都接触过ZXing和ZBar这类的第三方库,但从iOS7以后,苹果就给我们提供了系统原生的API来支持我们扫描获取二维码,ZXing和ZBar在使用中或多或少有不尽如人意的地方,再之停止更新很久了,所以今天我们就来聊聊如何用系统原生的方法扫描获取二维码。
Originalee
2018/08/30
8900
iOS 音视频采集要点梳理(1)
从 AVCaptureDevcie 捕获的数据,是个抽象类,需要继承后使用,例如**:**AVCaptureDeviceInput,还有其他input 源,可参考Apple 官网文档根据场景选用。
magianter
2021/12/06
8180
iOS中使用像素位图(CGImageRef)对图片进行处理
CGImageRef是定义在QuartzCore框架中的一个结构体指针,用C语言编写。在CGImage.h文件中,我们可以看到下面的定义:
珲少
2018/08/15
1.3K0
基于算法优化及深度学习的摄像头扫码速度提升实践
摄像头扫码在移动端应用得非常广泛,比如生活中,我们经常会扫付款码用于支付,在餐厅会扫码点餐,扫码添加公众号,扫快递单号,商品条码等等,应用场景几乎涵盖了生活的方方面面。所以扫码体验对于移动产品来说非常重要,直接影响了产品的转化率和用户满意度。摄像头扫码速度也一直是有赞的几个移动 App 最关注的指标之一。
有赞coder
2021/11/26
1.7K0
基于算法优化及深度学习的摄像头扫码速度提升实践
iOS处理图片颜色代码
处理图片颜色 (UIImage)grayscale:(UIImage)anImage type:(int)type{ CGImageRef imageRef = anImage.CGImage; size_t width = CGImageGetWidth(imageRef); size_t height = CGImageGetHeight(imageRef); size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef)
用户8983410
2021/10/31
1.9K0
QR码应用实战:Spring Boot与ZXing完美结合
在数字化时代,二维码已经成为了信息交流的一种常见方式。它们被广泛用于各种应用,从产品标签到活动传单,以及电子支付。本文将向您展示如何在Spring Boot应用程序中整合ZXing库,以创建和解析QR码。无论您是想为您的产品添加QR码功能,还是为您的移动应用程序添加扫描功能,这篇博客将为您提供一个清晰的指南。
一只牛博
2025/05/31
1300
推荐阅读
相关推荐
最新版基于ZXing的Android扫码库
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验