二维码扫描:ZBar,ZXing的使用

原文链接:http://blog.csdn.net/whjblog/article/details/15809859

iOS二维码扫描开源库主要有Zbar和ZXing,在完成项目的过程中都用过,开始时用了Zbar,但其相对于ZXing扫描识别效率太低,无法达到项目要求,所以改用ZXing。两个开源库都可以识别二维码,但ZBar还支持条形码,ZXing识别条形码还需要改一些地方。


一、ZBar的使用

1.下载ZBar SDK,将ZBarSDK拖动到Xcode项目

下载地址:https://github.com/bmorton/ZBarSDK

2.添加framework框架

      * AVFoundation.framework (weak)
      * CoreMedia.framework (weak)
      * CoreVideo.framework (weak)
      * QuartzCore.framework

3.扫描代码

引入头文件 #import  "ZBarSDK.h" ,实现ZBarReaderDelegate协议

[objc]  view plain copy print ?
  1. ZBarReaderViewController *reader = [ZBarReaderViewController new];  
  2.    reader.readerDelegate = self;  
  3.    reader.supportedOrientationsMask = ZBarOrientationMaskAll;  
  4.      
  5.    ZBarImageScanner *scanner = reader.scanner;  
  6.      
  7.    [scanner setSymbology: ZBAR_I25  
  8.                   config: ZBAR_CFG_ENABLE  
  9.                       to: 0];  
  10.      
  11.    [self presentModalViewController:reader animated:YES];  
  12.    [reader release];  

扫描结果回调

[objc]  view plain copy print ?
  1. - (void) imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo: (NSDictionary*) info  
  2. {  
  3.     id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];  
  4.     ZBarSymbol *symbol = nil;  
  5.     for(symbol in results)  
  6.         break;  
  7.       
  8.     text =  symbol.data ;  
  9. }  

还可以在ZBarReaderViewController自定义扫描界面和扫描区域(scanCrop)。


二、ZXing的使用

1.下载ZXIng,下载地址: https://github.com/zxing/zxing   .由于支持各种语言,整个工程比较大,IOS 只需保留cpp和iphone这2个文件夹,整个目录结构不变,cpp文件夹只保留cpp/core/src/zxing下面的内容,其余都可以全部删除。然后把删减好的zxing目录移动到我们的iOS项目的目录下(也可以右击选择Add files to ‘project’),并在 zxing/iphone/ZXingWidget/目录下把ZXingWidget.xcodeproj拖动到我们的项目工程中。

2.选择 target ——>Build Phases   在 Link Binary with Libraries里 添加libZXingWidget.a,在Target Dependencies添加ZXingWidget在target ——>Build Settings ——>Headers Search Path 添加两个路径: 

./zxing/iphone/ZXingWidget/Classes

./zxing/cpp/core/src

第一个设成recursive ,第二个设成non-recursive

添加一下frameworks 支持

  • AVFoundation
  • AudioToolbox
  • CoreVideo
  • CoreMedia
  • libiconv
  • AddressBook
  • AddressBookUI

3.扫描代码

(1)直接引用

头文件:
#import <ZXingWidgetController.h>

#import <QRCodeReader.h>

扫描调用代码:

[objc]  view plain copy print ?
  1. ZXingWidgetController *widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO];  
  2.    NSMutableSet *readers = [[NSMutableSet alloc] init];  
  3.    QRCodeReader *qrcodeReader = [[QRCodeReader alloc] init];  
  4.    [readers addObject:qrcodeReader];  
  5.    widController.readers = readers;  
  6.    [self presentViewController:widController animated:YES completion:^{}];  

扫描结果回调:

[objc]  view plain copy print ?
  1. @protocol ZXingDelegate  
  2. - (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result;  
  3. - (void)zxingControllerDidCancel:(ZXingWidgetController*)controller;  
  4. @end  

还需要把引入的.m文件改为.mm。

(2)自定义扫描

我的项目要求中需要自定义扫描界面和扫描区域,还要加入C语言混编,所以就用了这种方法。

头文件:

[objc]  view plain copy print ?
  1. #import <AssetsLibrary/AssetsLibrary.h>  
  2. #import <QRCodeReader.h>  
  3. #import <TwoDDecoderResult.h>  
  4. #import <Decoder.h>  

初始化AVCapture

[objc]  view plain copy print ?
  1. - (void)initCapture  
  2. {  
  3.   AVCaptureDevice* inputDevice =  
  4.     [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];  
  5.   AVCaptureDeviceInput *captureInput =  
  6.     [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:nil];  
  7.   AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init];   
  8.   captureOutput.alwaysDiscardsLateVideoFrames = YES;   
  9.   [captureOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];  
  10.   NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;  
  11.   NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];   
  12.   NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];   
  13.   [captureOutput setVideoSettings:videoSettings];   
  14.   self.captureSession = [[[AVCaptureSession alloc] init] autorelease];  
  15.   
  16.   NSString* preset = 0;  
  17.   if (NSClassFromString(@"NSOrderedSet") && // Proxy for "is this iOS 5" ...  
  18.       [UIScreen mainScreen].scale > 1 &&  
  19.       isIPad() &&   
  20.       [inputDevice  
  21.         supportsAVCaptureSessionPreset:AVCaptureSessionPresetiFrame960x540]) {  
  22.     preset = AVCaptureSessionPresetiFrame960x540;  
  23.   }  
  24.   if (!preset) {  
  25.     preset = AVCaptureSessionPresetMedium;  
  26.   }  
  27.   self.captureSession.sessionPreset = preset;  
  28.   
  29.   [self.captureSession addInput:captureInput];  
  30.   [self.captureSession addOutput:captureOutput];  
  31.   
  32.   [captureOutput release];  
  33.   
  34.   if (!self.prevLayer) {  
  35.     self.prevLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession];  
  36.   }  
  37.   self.prevLayer.frame = self.view.bounds;  
  38.   self.prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;  
  39.   [self.view.layer addSublayerself.prevLayer];  
  40.   [self.captureSession startRunning];  
  41. }  

 得到AVCapture回调函数

[objc]  view plain copy print ?
  1. - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection  
  2. {  
  3.     if (!isScanning||delegate==nil) {  
  4.         return;  
  5.     }  
  6.     if (sampleBuffer)  
  7.     {  
  8.         //将sampleBuffer转化为UIImage  
  9.         UIImage *image = [self imageFromSampleBuffer:sampleBuffer];  
  10.         //用Decoder来解析识别图像  
  11.         [self decodeImage:image];  
  12.     }  
  13. }  
[objc]  view plain copy print ?
  1. - (void)decodeImage:(UIImage *)image  
  2. {  
  3.     NSMutableSet *qrReader = [[NSMutableSet alloc] init];  
  4.     QRCodeReader *qrcoderReader = [[QRCodeReader alloc] init];  
  5.     [qrReader addObject:qrcoderReader];  
  6.     [qrcoderReader release];  
  7.       
  8.     Decoder *decoder = [[Decoder alloc] init];  
  9.     decoder.delegate = self;  
  10.     decoder.readers = qrReader;  
  11.     [decoder decodeImage:image];  
  12.     [decoder release];  
  13.     [qrReader release];  
  14. }  
Decoder回调获得识别结果

[objc]  view plain copy print ?
  1. @optional  
  2. - (void)decoder:(Decoder *)decoder willDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset;  
  3. - (void)decoder:(Decoder *)decoder didDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset withResult:(TwoDDecoderResult *)result;  
  4. - (void)decoder:(Decoder *)decoder failedToDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset reason:(NSString *)reason;  
  5. - (void)decoder:(Decoder *)decoder foundPossibleResultPoint:(CGPoint)point;  

注意扫描的画面不会跟着设备旋转,当横竖转换是需要改变画面

[objc]  view plain copy print ?
  1. CGFloat angle = 0.0f;  
  2.     switch (barOrientation)  
  3.     {  
  4.         case UIInterfaceOrientationPortrait:  
  5.             angle = 0.0f;  
  6.             break;  
  7.         case UIInterfaceOrientationPortraitUpsideDown:  
  8.             angle = M_PI;  
  9.             break;  
  10.         case UIInterfaceOrientationLandscapeLeft:  
  11.             angle = M_PI / 2;  
  12.             break;  
  13.         case UIInterfaceOrientationLandscapeRight:  
  14.             angle = -M_PI / 2;  
  15.             break;  
  16.         default:  
  17.             break;  
  18.     }  
  19.     CATransform3D transform =  CATransform3DMakeRotation(angle, 001.0);  
  20.     self.captureVideoPreviewLayer.transform =transform;  
  21.     self.captureVideoPreviewLayer.frame = layerframe;  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Studio 可以使用 Zbar 库来实现二维码识别。Zbar 是一个开源的条码识别库,可以支持多种类型的条码和二维码,包括 QR 码、Data Matrix 码等。在 Android Studio 中,可以通过添加 Zbar 库的依赖,然后在代码中调用相关 API 来实现二维码扫描和识别。同时,还需要在 AndroidManifest.xml 文件中添加相应的权限声明,例如相机权限等。通过这种方式,就可以在 Android 应用中集成二维码扫描功能了。 ### 回答2: Android Studio 是一款用于开发Android应用程序的集成开发环境(IDE),而Zbar 是一个流行的二维码扫描库,可用于实现二维码的识别。 首先,我们需要在Android Studio中配置Zbar库。可以通过在项目的build.gradle文件中添加Zbar依赖项来完成配置。然后,我们需要在AndroidManifest.xml文件中添加必要的权限,如摄像头权限等。 接下来,在我们想要进行二维码识别的Activity中,我们需要初始化Zbar库并打开相机。我们可以在Activity的onCreate()方法中进行这些操作。 在初始化和打开相机之后,我们需要在相机预览界面中实现一个回调函数,以便在捕捉到图像时进行二维码的识别。我们可以使用Zbar库提供的接口来实现这个回调函数,并在回调函数中调用Zbar二维码识别方法。 一旦识别到二维码,我们可以通过定义一个回调接口来接收识别结果,并在回调接口中处理这些结果。可以根据需要,将识别的二维码信息展示出来,或者执行其他操作。 最后,在Activity的onDestroy()方法中,我们需要释放相机资源和关闭Zbar库。 以上就是使用Android Studio和Zbar库实现二维码识别的大致步骤。当然,具体的实现细节还需要根据具体的项目需求进行相应修改和补充。希望以上回答对您有帮助! ### 回答3: 在Android Studio中使用Zbar库来实现二维码识别非常简便。以下是一个简单的步骤指南: 首先,你需要在你的项目的build.gradle文件中添加Zbar库的依赖项。 在dependencies区块中添加以下代码: ```gradle implementation 'me.dm7.barcodescanner:zxing:1.9.13' ``` 下一步是在你的布局文件中添加一个BarcodeScannerView,这将用于显示相机预览和捕获二维码图像。 ```xml <me.dm7.barcodescanner.zxing.ZXingScannerView android:id="@+id/scanner_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 然后,在你的Activity或Fragment的代码中,你需要初始化和控制BarcodeScannerView。 首先,在你的onCreate方法中实例化一个BarcodeScannerView对象: ```java private ZXingScannerView mScannerView; ``` 然后,在onResume方法中初始化BarcodeScannerView,并启动相机预览: ```java @Override public void onResume() { super.onResume(); mScannerView = new ZXingScannerView(this); setContentView(mScannerView); mScannerView.setResultHandler(this); mScannerView.startCamera(); } ``` 接下来,你需要实现回调方法来处理识别到的二维码数据: ```java @Override public void handleResult(Result result) { // 在这里处理识别到的二维码数据 String qrCodeData = result.getText(); // 你可以对数据进行任何你想要的处理 // ... // 完成后,重新启动相机预览 mScannerView.resumeCameraPreview(this); } ``` 最后,在onPause方法中释放BarcodeScannerView资源: ```java @Override public void onPause() { super.onPause(); mScannerView.stopCamera(); } ``` 通过以上步骤,你就可以在Android Studio中使用Zbar来实现二维码的识别了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值