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

文章目录


前言

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对象
objectivec 复制代码
- (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;
}

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

objectivec 复制代码
- (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:request
        completionHandler:^(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"];
            //打印应答中的body
            NSLog(@"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];
}

运行结果如下:

相关推荐
啦啦啦!5 分钟前
ChatGPT和Gemini的接入和封装
人工智能·ios·chatgpt
aosky22 分钟前
手机远程畅玩OpenAI Codex
macos·智能手机·cocoa
报错小能手1 小时前
ios开发方向——swift并发进阶核心 async/await 详解
开发语言·ios·swift
开心就好20251 小时前
HTTPS超文本传输安全协议全面解析与工作原理
后端·ios
Digitally2 小时前
荣耀手机数据迁移至 iPhone 教程
智能手机·cocoa·iphone
牛马1112 小时前
Flutter iOS 权限配置完整指南(定位权限)
flutter·ios
A_QXBlms2 小时前
多账号轮询架构 — 利用企销宝iPad协议突破单账号群发次数限制
ios·架构·ipad
HH思️️无邪3 小时前
Flutter + iOS 实战指南:教程视频 PiP + 退桌面(可复用模板)
flutter·ios
A懿轩A3 小时前
【2026 最新】Python 下载与安装:在 macOS 下使用 Homebrew 和 pyenv 完美管理多版本 Python
python·macos·mac
IKaros_α‌3 小时前
mac上安装openclaw从入门到删除
macos