【iOS】——使用ZXingObjC库实现条形码识别并请求信息

文章目录

  • 前言
  • 一、实现步骤
  • 二、扫描界面和扫描框的样式
    • 1.扫描界面
    • 2.扫描框
  • 三、实现步骤


前言

ZXing库是一个专门用来解析多种二维码和条形码(包括包括 QR Code、Aztec Code、UPC、EAN、Code 39、Code 128等)的开源性质的处理库,而ZingObjC库是它的一个移植版本。由于博主还没有真机进行调试,所以舍去了使用摄像头的一些方法,仅实现其最终识别结果的方法。


一、实现步骤

使用ZXingObjC库完整的步骤分为以下六步:

  1. 为项目工程导入ZXingObjC库,可以在GitHub上直接搜索下载也可以使用Cocoa Pods进行安装
  2. 在需要使用ZXingObjC库的地方引入头文件#import <ZXingObjC/ZXingObjC.h>
  3. 创建扫描头,也就是创建一个 ZXCapture 对象,该对象负责管理扫描的整个过程。可以设置代理来接收扫描结果 self.capture = [[ZXCapture alloc] init]; self.capture.delegate = self;
  4. 配置扫描界面,可以设置扫描界面的样式和布局,例如扫描框的样式、扫描线的颜色等 self.capture.layer.frame = self.view.bounds; [self.view.layer addSublayer:self.capture.layer];
  5. 开始扫描:调用 ZXCapture 对象的 start 方法开始扫描 [self.capture start];
  6. 处理扫描结果:通过实现 ZXCaptureDelegate 协议中的方法来处理扫描结果。例如:
    - (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result { if (result) { NSString *contents = result.text; // 处理扫描到的内容 } }

二、扫描界面和扫描框的样式

1.扫描界面

  • 设置扫描界面的背景色:通过修改 capture.layer.backgroundColor 属性来改变扫描界面的背景颜色
  • 设置扫描线的颜色:通过修改 capture.layer.scanColor 属性来改变扫描线的颜色
  • 设置扫描线的样式:通过修改 capture.layer.scanLineStyle 属性来改变扫描线的样式,可选值包括线条、网格等。
  • 设置扫描区域的方向:通过修改 capture.camera 的 orientation 属性来设置扫描区域的方向,例如横向或纵向扫描
  • 设置扫描速度和精度:可以通过capture.rotation属性来设置扫描的速度和精度,值越大速度越快精度也就越低

2.扫描框

  • 设置扫描框的位置和大小:通过修改 capture.layer.scanRect 属性来设置扫描框的位置和大小,以相对于扫描界面的比例表示
  • 设置扫描框的颜色和边框:可以使用 UIView 来创建一个矩形视图,并设置它的背景色和边框样式来实现扫描框的外观。
  • 设置扫描框的角标样式:可以使用 CALayer 的 cornerRadius 和 borderWidth 属性来设置扫描框的角标样式。

三、实现步骤

这里我是用来实现识别以图片形式传入的条形码
实现解码的步骤总共分为以下这几步:

  1. 将传入的UIImage对象作为转换为成CGImageRef对象,然后使用 ZXCGImageLuminanceSource 创建一个 ZXLuminanceSource 对象来提供图像数据
  2. 使用 ZXHybridBinarizer 对象对图像进行二值化处理,创建一个 ZXBinaryBitmap对象用于后续的解码
  3. 创建一个 ZXDecodeHints 对象,用于配置解码器的选项。这里使用了默认的选项。然后创建一个 ZXMultiFormatReader****对象,用来条形码解码
  4. 最后,调用 decode: 方法对图像进行解码,返回解码结果ZXResult对象
- (NSString*)recognizeBarcodeInImage:(UIImage *)image {CGImageRef cgImage = image.CGImage;ZXLuminanceSource *source = [[ZXCGImageLuminanceSource alloc] initWithCGImage:cgImage];ZXBinaryBitmap *bitmap = [ZXBinaryBitmap binaryBitmapWithBinarizer:[ZXHybridBinarizer binarizerWithSource:source]];NSError *error = nil;ZXDecodeHints *hints = [ZXDecodeHints hints];ZXMultiFormatReader *reader = [ZXMultiFormatReader reader];ZXResult *result = [reader decode:bitmap hints:hints error:&error];if (result) {NSString *barcodeValue = result.text;NSLog(@"扫描到的条形码: %@", barcodeValue);} else {NSLog(@"条形码识别出错: %@", error);}return result.text;
}

下面是用解码的信息进行简单的网络请求

- (void)networkGetBarcodeData:(NSString*)querysData {
NSString *encodedString = [querysData stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];NSString *urlString = [NSString stringWithFormat:@"此处为API接口/%@", encodedString];NSURL* url = [NSURL URLWithString:urlString];NSURLRequest* request = [NSURLRequest requestWithURL:url];NSURLSession* session = [NSURLSession sharedSession];NSURLSessionDataTask *task = [session dataTaskWithRequest:requestcompletionHandler:^(NSData * _Nullable body , NSURLResponse * _Nullable response, NSError * _Nullable error) {if (error == nil) {NSString *bodyString = [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding];NSDictionary *bodyDictionary = [NSJSONSerialization JSONObjectWithData:body options:kNilOptions error:nil];NSDictionary* dataDictionary = bodyDictionary[@"data"];//打印应答中的bodyNSLog(@"Response body: %@" , bodyString);NSString* brand = dataDictionary[@"trademark"];NSString* name = dataDictionary[@"goodsName"];NSLog(@"brand:%@", brand);NSLog(@"name:%@", name);NSString* medicineName = [NSString stringWithFormat:@"%@",  name];self.myBarcodeValue = medicineName;dispatch_async(dispatch_get_main_queue(), ^{self.medicineLabel.text = self.myBarcodeValue;});} else {NSLog(@"错误是%@",error);}}];[task resume];
}

运行结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2777697.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯刷题day08——完全日期

1、题目描述 如果一个日期中年月日的各位数字之和是完全平方数&#xff0c;则称为一个完全日期。 例如&#xff1a;2021年6月5日的各位数字之和为20216516&#xff0c;而16是一个完全平方数&#xff0c;它是4的平方。所以2021年6月5日是一个完全日期。 请问&#xff0c;从200…

怎么加密电脑磁盘?磁盘加密软件哪个好?

磁盘是电脑储存数据的基础工具&#xff0c;可以存放大量数据。为了避免数据泄露&#xff0c;可以使用专业的磁盘加密软件加密保护电脑磁盘。那么&#xff0c;磁盘加密软件哪个好呢&#xff1f;下面我们就来了解一下。 磁盘加锁专家 磁盘加锁专家是一款专业的磁盘加锁软件&…

社区店选址要素揭秘:人流量与商业潜力的关键

开店五年&#xff0c;我深刻体会到选址对于社区店的重要性。 不管是哪个行业的实体店&#xff0c;选址更是决定成败的关键因素之一。今天&#xff0c;我就以一名资深鲜奶吧创业者的身份&#xff0c;来揭秘社区店选址的几大要素&#xff0c;帮助大家在创业的道路上少走弯路。 …

C#使用哈希表对XML文件进行查询

目录 一、使用的方法 1.Hashtable哈希表 2.Hashtable哈希表的Add方法 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;示例 3.XML文件的使用 二、实例 1.源码 2.生成效果 可以通过使用哈希表可以对XML文件进行查询。 一、使用的方法 1.Hashtable哈希表…

spring上下文源码分析

请直接看原文: 原文链接: 一文搞懂Spring上下文生命周期 | spring系列第55篇-腾讯云开发者社区-腾讯云 (tencent.com) -------------------------------------------------------------------------------------------------------------------------------- 本文主要内容&a…

linux应用 进程间通信之信号量(System V)

1、定义 System V 信号量是一种用于进程间同步和互斥的机制&#xff0c;它是 System V IPC&#xff08;Inter-Process Communication&#xff0c;进程间通信&#xff09;机制的一部分。信号量通常用于控制对共享资源的访问&#xff0c;以避免竞争条件&#xff08;race conditi…

2024年【N1叉车司机】新版试题及N1叉车司机模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机新版试题参考答案及N1叉车司机考试试题解析是安全生产模拟考试一点通题库老师及N1叉车司机操作证已考过的学员汇总&#xff0c;相对有效帮助N1叉车司机模拟考试题库学员顺利通过考试。 1、【多选题】《中华…

计算机服务器中了mkp勒索病毒如何解密,mkp勒索病毒解密流程

随着网络技术的不断发展与应用&#xff0c;越来越多的企业走向数字化办公模式&#xff0c;计算机极大地方便了企业的正常生产运营&#xff0c;但网络威胁的手段也不断增加。近期&#xff0c;云天数据恢复接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mkp勒索病毒攻击…

重学JavaScript高级(十二):async/await-事件循环-面试高频

async/await-事件循环 前面我们学习了生成器和迭代器&#xff0c;那么在本篇文章中&#xff0c;我们主要讲解生成器与Promise的结合使用&#xff0c;从而引出async/await语法&#xff0c;同时会涉及面试中频次最高的一个知识点&#xff1a;事件循环 生成器与异步处理 首先需要…

【分布式技术专题】「Zookeeper中间件」Paxos协议的原理和实际运行中的应用流程分析

Paxo算法介绍 Paxos算法是莱斯利兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。 Paxos产生背景 Paxos算法是基于消息传递且具有高度容错特性的一致性算法&#xff0c;是目前公认的解决分布式一致性问题最有效的算法之一&#xff0c;其解决的问题就是在分…

SQL拆分字段内容(含分隔符)

问题描述&#xff1a; 在做数据迁移的过程中&#xff0c;我们希望对表中的某个字段根据分隔符进行拆分&#xff0c;得到多条数据&#xff0c;原代码有点意思&#xff0c;因此记录一下。 我们假设某条数据如下&#xff1a; IDSTRS1公司名称不能小于四个字&#xff0c;行业类别…

SSM框架,Spring-ioc的学习(上)

知识点引入 关于框架 框架( Framework )是一个集成了基本结构、规范、设计模式、编程语言和程序库等基础组件的软件系统&#xff0c;它可以用来构建更高级别的应用程序。框架的设计和实现旨在解决特定领域中的常见问题&#xff0c;帮助开发人员更高效、更稳定地实现软件开发目…

python-pandas查漏补缺

1. create labels for Series 2. 3. 4. 用平均数等去填empty的格子 5. 6. 7.

SPSS双变量相关分析

双变量相关分析通过计算皮尔逊简单相关系数、斯皮尔曼等级相关系数、肯德尔等级相关系数及其显著性水平展开。其中皮尔逊简单相关系数是一种线性关联度量&#xff0c;适用于变量为定量连续变量且服从正态分布、相关关系为线性时的情形。如果变量不是正态分布的&#xff0c;或具…

基于springboot超市进销存系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;超市进销存系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而超…

小游戏和GUI编程(3) | 基于 SFML 的字符阵

小游戏和GUI编程(3) | 基于 SFML 的字符阵 1. 简介 使用 EasyX 图形库时&#xff0c; 官方第一个例子是字符阵。 EasyX 不开源&#xff0c; 也不能跨平台&#xff0c; API 陈旧&#xff0c; API 是 C 而不是 C。 现在使用 SFML 来实现字符阵&#xff0c; 克服 EasyX 的这些问…

Java并发基础:LinkedTransferQueue全面解析!

内容概要 LinkedTransferQueue类实现了高效的线程间数据传递&#xff0c;支持等待匹配的生产者-消费者模式&#xff0c;基于链表的无界设计使其在高并发场景下表现卓越&#xff0c;且无需担心队列溢出&#xff0c;丰富的方法和良好的可扩展性满足了各种复杂应用场景的需求。 …

2024牛客寒假算法基础集训营3部分题解

智乃与瞩目狸猫、幸运水母、月宫龙虾 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 Ubuntu是一个以桌面应用为主的Linux发行版操作系统&#xff0c;其名称来自非洲南部祖鲁语或豪萨语的"ubuntu"一词&#xff0c;意思是"人性…

无心剑汉英双语诗《龙年大吉》

七绝龙年大吉 Great Luck in the Dragon Year 龙腾五岳九州圆 年吼佳音万里传 大漠苍鹰华夏梦 吉人天相铸奇缘 Dragon flies over five peaks watching the divine land so great and round, New Year’s call sends joyous tidal waves far across the world’s bound. The…

[office] 怎么在Excel2003菜单栏自定义一个选项卡 #其他#微信#知识分享

怎么在Excel2003菜单栏自定义一个选项卡 怎么在Excel2003菜单栏自定义一个选项卡 ①启动Excel2003&#xff0c;单击菜单栏--工具--自定义。 ②在自定义界面&#xff0c;我们单击命令标签&#xff0c;在类别中选择新菜单&#xff0c;鼠标左键按住新菜单&#xff0c;拖放到菜单栏…