iOS 7以上原生二维码、条码扫描(ZXingObjC相册读取)

//

//? SYTCodeScanerViewController.m

//? SYTCodeScan

//

//? Created by iMac on 15/5/6.

//? Copyright (c) 2015年 S.A. All rights reserved.

//

?

#import "SYTCodeScanerViewController.h"

#import <AVFoundation/AVFoundation.h>

#import <AudioToolbox/AudioToolbox.h>

#import <ZXingObjC/ZXingObjC.h>

?

?

@interfaceSYTCodeScanerViewController ()<AVCaptureMetadataOutputObjectsDelegate, UIImagePickerControllerDelegate,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UINavigationControllerDelegate, UIAlertViewDelegate>

?

@property (nonatomic ,strong) AVCaptureSession *captureSession; ? ? ? ? ? ? ? ? //捕捉会话

@property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;? ? //预览图层layer

@property (strong, nonatomic) UIView *boxView;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //扫描识别框

?

@property (weak, nonatomic) IBOutletUIButton *scanImageButton;

@property (nonatomic, strong) UIImagePickerController *imagePickerController;

@property (weak, nonatomic) IBOutletUIButton *openTorchButton;

?

@end

?

@implementation SYTCodeScanerViewController

?

- (void)viewDidLoad {

?? ?

? ? [superviewDidLoad];

?? ?

? ? [selfstartScan];

}

?

- (void)viewWillAppear:(BOOL)animated

{

? ? [super viewWillAppear:animated];

?? ?

}

?

- (void)viewDidAppear:(BOOL)animated

{

? ? [super viewDidAppear:animated];

}

?

-(void)viewDidDisappear:(BOOL)animated{

? ? [super viewDidDisappear:animated];

}

?

- (void)dealloc

{

? ? [selfstopScanner];

}

?

- (void)startScan

{

? ? //初始化设备(摄像头)

? ? NSError *error = nil;

? ? AVCaptureDevice *captureDevice = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];

?? ?

? ? //创建输入流

? ? AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];

? ? if (error)

? ? {

? ? ? ? NSLog(@"没有摄像头:%@", error.localizedDescription);

? ? ? ? return;

? ? }

?? ?

?? ?

? ? //创建输出流

? ? AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutputalloc] init];

?? ?

? ? //实例化捕捉会话并添加输入,输出流

? ? if (!_captureSession) {

? ? ? ? _captureSession = [[AVCaptureSession alloc] init];

? ? }

?? ?

? ? //高质量采集率

? ? [_captureSessionsetSessionPreset:AVCaptureSessionPresetHigh];

?? ?

? ? [_captureSessionaddInput:input];

? ? [_captureSession addOutput:output];

?? ?

? ? //设置输出的代理,在主线程里刷新

? ? [output setMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()]; ? //用串行队列新线程结果在UI上显示较慢

?? ?

? ? //扫码类型

? ? [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode, ? ? ? ? //二维码

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVMetadataObjectTypeCode39Code, ? ? //条形码 ? 韵达和申通

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVMetadataObjectTypeCode128Code,? ? //CODE128条码? 顺丰用的

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVMetadataObjectTypeCode39Mod43Code,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVMetadataObjectTypeEAN13Code,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVMetadataObjectTypeEAN8Code,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVMetadataObjectTypeCode93Code,? ? //条形码,星号来表示起始符及终止符,如邮政EMS单上的条码

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVMetadataObjectTypeUPCECode]];

?? ?

? ? _videoPreviewLayer = [[AVCaptureVideoPreviewLayeralloc] initWithSession:_captureSession];

?? ?

? ? [_videoPreviewLayersetVideoGravity:AVLayerVideoGravityResizeAspectFill];

?? ?

? ? //添加预览图层

? ? _videoPreviewLayer.frame = self.view.bounds;

? ? [self.view.layeraddSublayer:_videoPreviewLayer];

? ? [self.viewbringSubviewToFront:self.view.subviews[0]];

?

?? ?

? ? //扫描框

?? ?

? ? _boxView = [[UIViewalloc] initWithFrame:CGRectMake(60, 100, 200, 200)];

? ? _boxView.layer.borderColor = [UIColorgreenColor].CGColor;

? ? _boxView.layer.borderWidth = 1.0f;

? ? [self.view addSubview:_boxView];

?? ?

? ? //扫描识别范围

? ? output.rectOfInterest = CGRectMake(100 / self.view.bounds.size.height,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 60? / self.view.bounds.size.width,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 200 / self.view.bounds.size.height,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 200 / self.view.bounds.size.width);

?? ?

? ? //开始扫描

? ? [_captureSessionstartRunning];

?? ?

}

?

- (void)stopScanner

{

? ? [self openLight:NO];

?? ?

? ? [self.captureSessionstopRunning];

? ? self.captureSession = nil;

}

?

#pragma mark - 扫描结果代理方法

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

{

? ? [_captureSessionstopRunning];

//? ? [_videoPreviewLayer removeFromSuperlayer];

?? ?

? ? if (metadataObjects.count > 0) {

?? ? ? ?

? ? ? ? [self playBeep];

?? ? ? ?

? ? ? ? AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];

?? ? ? ?

? ? ? ? [selfshowInfoWithMessage:obj.stringValueandTitle:@"扫描成功"];

?? ? ? ?

? ? ? ? NSLog(@"扫码扫描结果obj.stringValue == %@", obj.stringValue);

?? ? ? ?

? ? }

?? ?

}

?

?

#pragma mark 照片处理

?

-(void)getInfoWithImage:(UIImage *)img{

?? ?

? ? UIImage *loadImage= img;

? ? CGImageRef imageToDecode = loadImage.CGImage;

?? ?

? ? ZXLuminanceSource *source = [[ZXCGImageLuminanceSourcealloc] initWithCGImage:imageToDecode];

? ? ZXBinaryBitmap *bitmap = [ZXBinaryBitmapbinaryBitmapWithBinarizer:[ZXHybridBinarizerbinarizerWithSource:source]];

?? ?

? ? NSError *error = nil;

?? ?

? ? ZXDecodeHints *hints = [ZXDecodeHintshints];

?? ?

? ? ZXMultiFormatReader *reader = [ZXMultiFormatReaderreader];

? ? ZXResult *result = [reader decode:bitmap

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hints:hints

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? error:&error];

?? ?

? ? if (result) {

?? ? ? ?

? ? ? ? NSString *contents = result.text;

? ? ? ? [selfshowInfoWithMessage:contents andTitle:@"解析成功"];

?? ? ? ?

? ? ? ? NSLog(@"相册图片contents == %@",contents);

?? ? ? ?

? ? } else {

?? ? ? ?

? ? ? ? [selfshowInfoWithMessage:nilandTitle:@"解析失败"];

?? ? ? ?

? ? }

}

?

- (void)showInfoWithMessage:(NSString *)message andTitle:(NSString *)title

{

? ? UIAlertView *alter = [[UIAlertViewalloc] initWithTitle:title message:message delegate:selfcancelButtonTitle:@"确定"otherButtonTitles:nil];

? ? [alter show];

?? ?

}

?

#pragma - mark UIAlertViewDelegate

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

? ? dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

?? ? ? ?

? ? ? ? [_captureSessionstartRunning];

? ? });

}

?

?

#pragma - mark - UIImagePickerViewControllerDelegate

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

{

? ? UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];

?

? ? [selfdismissViewControllerAnimated:YEScompletion:^{

?? ? ? ?

? ? ? ? [self getInfoWithImage:image];

? ? }];

}

?

?

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker

{

? ? [_captureSessionstartRunning];

?? ?

? ? [self.imagePickerControllerdismissViewControllerAnimated:YEScompletion:nil];

?

}

?

//PS:info.plist文件已添加 Localizations 项,并选择语言为 Chinese (simplified),使相册的选择,打开,取消等按键为中文.

- (IBAction)photoPickBtn:(UIButton *)sender {

?? ?

? ? [_captureSessionstopRunning];

?? ?

? ? if (!_imagePickerController) {

?? ? ? ?

? ? ? ? _imagePickerController = [[UIImagePickerControlleralloc] init];

? ? ? ? _imagePickerController.delegate = self;

? ? ? ? _imagePickerController.allowsEditing = YES;

? ? ? ? _imagePickerController.SourceType = UIImagePickerControllerSourceTypePhotoLibrary;

? ? }

?? ?

? ? [selfpresentViewController:self.imagePickerControlleranimated:YEScompletion:nil];

?? ?

}

?

//扫描震动

- (void)playBeep

{

? ? SystemSoundID soundID;

? ? AudioServicesCreateSystemSoundID((__bridgeCFURLRef)[NSURLfileURLWithPath:[[NSBundlemainBundle] pathForResource:@"beep"ofType:@"wav"]], &soundID);

? ? AudioServicesPlaySystemSound(soundID);

?? ?

? ? // Vibrate

? ? AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

}

?

//闪光灯

- (BOOL)isLightOpened

{

? ? AVCaptureDevice *device = [AVCaptureDevicedefaultDeviceWithMediaType: AVMediaTypeVideo];

? ? if (![device hasTorch]) {

? ? ? ? return NO;

? ? }else{

? ? ? ? if ([device torchMode] == AVCaptureTorchModeOn) {

? ? ? ? ? ? return YES;

? ? ? ? } else {

? ? ? ? ? ? return NO;

? ? ? ? }

? ? }

}

?

- (void)openLight:(BOOL)open

{

? ? AVCaptureDevice *device = [AVCaptureDevicedefaultDeviceWithMediaType: AVMediaTypeVideo];//[self.reader.readerView device];

? ? if (![device hasTorch]) {

? ? } else {

? ? ? ? if (open) {

? ? ? ? ? ? // 开启闪光灯

? ? ? ? ? ? if(device.torchMode != AVCaptureTorchModeOn ||

?? ? ? ? ? ? ? device.flashMode != AVCaptureFlashModeOn){

? ? ? ? ? ? ? ? [device lockForConfiguration:nil];

? ? ? ? ? ? ? ? [device setTorchMode:AVCaptureTorchModeOn];

? ? ? ? ? ? ? ? [device setFlashMode:AVCaptureFlashModeOn];

? ? ? ? ? ? ? ? [device unlockForConfiguration];

? ? ? ? ? ? }

? ? ? ? } else {

? ? ? ? ? ? // 关闭闪光灯

? ? ? ? ? ? if(device.torchMode != AVCaptureTorchModeOff ||

?? ? ? ? ? ? ? device.flashMode != AVCaptureFlashModeOff){

? ? ? ? ? ? ? ? [device lockForConfiguration:nil];

? ? ? ? ? ? ? ? [device setTorchMode:AVCaptureTorchModeOff];

? ? ? ? ? ? ? ? [device setFlashMode:AVCaptureFlashModeOff];

? ? ? ? ? ? ? ? [device unlockForConfiguration];

? ? ? ? ? ? }

? ? ? ? }

? ? }

}

?

- (IBAction)openTorchButtonTouched:(id)sender {

?? ?

? ? UIButton *torchBtn = sender;

? ? BOOL isLightOpened = [self isLightOpened];

?? ?

? ? if (isLightOpened) {

//? ? ? ? [torchBtn setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"scan_flash_closed" ofType:@"png"]] forState:UIControlStateNormal];

? ? ? ? [torchBtn setBackgroundColor:[UIColorclearColor]];

? ? ? ? [torchBtn setTitleColor:[UIColorwhiteColor] forState:UIControlStateNormal];

? ? ? ? [self.openTorchButtonsetTitle:@"开灯"forState:UIControlStateNormal];

? ? }

? ? else

? ? {

//? ? ? ? [torchBtn setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"scan_flash_opened" ofType:@"png"]] forState:UIControlStateNormal];

? ? ? ? [torchBtn setBackgroundColor:[UIColorwhiteColor]];

? ? ? ? [torchBtn setTitleColor:[UIColorblackColor] forState:UIControlStateNormal];

? ? ? ? [self.openTorchButtonsetTitle:@"关灯"forState:UIControlStateNormal];

? ? }

?? ?

? ? [self openLight:!isLightOpened];

}

?

?

@end

时间: 2024-10-09 02:47:37

iOS 7以上原生二维码、条码扫描(ZXingObjC相册读取)的相关文章

二维码/条码扫描

自己写了一个使用系统框架实现的二维码/条码扫描,扫描效率高.识别度高,可直接使用. 代码下载地址 https://github.com/JonnyFan/Scan.git

iOS系统原生二维码条形码扫描

本文讲述如何用系统自带的东东实现二维码扫描的功能:点击当前页面的某个按钮,创建扫描VIEW.细心的小伙伴可以发现 title被改变了,返回按钮被隐藏了.这个代码自己写就行了,与本文关系不大...绿色的线会上下跑,不要担心:D 实现效果如下: 1.在工程中添加框架AVFoundation.framework 2.声明代理:AVCaptureMetadataOutputObjectsDelegate . define 几个东东用来画框.画线: #define SCANVIEW_EdgeTop 40.

二维码扫描(iOS原生二维码扫描)

一.关于二维码扫描的第三方库有很多:例如比较常用的两个 1.ZBar SDK ZBar为我们提供了两种使用方式,一种是直接调用ZBar提供的ZBarReaderViewController打开一个扫描界面,另一种方式是使用ZBar提供的可以嵌在其他视图中的ZBarReaderView,实际项目中我们更可能会使用第二种方式,这可以让我们对界面做更多的定制,详细的百度查找相关文档来看. 2.ZXing(Github镜像地址)是一个开源的条码生成和扫描库(开源协议为Apache2.0).它不但支持众多

iOS之原生二维码扫描

做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framework框架到你工程中build phase的"Link Binary With Libraries"之下,然后就可以开始了. 一.做好准备工作,搭建UI IBOutlet.IBAction如下: @property (weak, nonatomic) IBOutlet UIView *vie

iOS:原生二维码扫描

做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framework框架到你工程中build phase的"Link Binary With Libraries"之下,然后就可以开始了. 一.做好准备工作,搭建UI UI效果如图 IBOutlet.IBAction如下: @property (weak, nonatomic) IBOutlet UIVi

iOS开发-定制多样式二维码

iOS开发-定制多样式二维码 二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常见的二维码功能包括信息获取.网站跳转.电商交易.手机支付等等,其拥有密度小.信息容量大.容错能力强.成本低.制作难度低等优点.在移动开发中,二维码的地位也越来越重要,掌握二维码的基本操作是重要的本领之一. 在iOS7之后,苹果自身集成了二维码的生成和读取功能.生成二维码包括以下步骤 1.导入CoreIm

iOS 开发之 ZBarSDK 二维码扫描自定义二维码扫描页面(二)

iOS 开发之 ZBarSDK 二维码扫描自定义二维码扫描页面(二) 上一篇解决了ZBarSDK不支持64bit的问题,下面我们就可以使用ZBarSDK了. 导入ZBarSDk.h文件 附上代码: // //  MeViewController.m //  Auditory Blog // //  Created by 寒竹子 on 15/4/28. //  Copyright (c) 2015年 寒竹子. All rights reserved. // #define ScanWidth  2

IOS使用ZBarSDK实现二维码的生成和扫描

现在二维码的使用也是越来越多,那我们在做APP的时候,有时也需要考虑二维码的生成和扫描 首先简单的讲一下二维码的生成 首先定义一个ImageView来显示生成的二维码图片 只是简单的做一下字符串转化成二维码 导入 libqrencode文件 引入头文件#import "QRCodeGenerator.h" 即可使用 imageview.image = [QRCodeGenerator qrImageForString:@"www.cnblogs.com/myselfxiaox

ios7 苹果原生二维码扫描

在ios7苹果推出了二维码扫描,以前想要做二维码扫描,只能通过第三方ZBar与ZXing. ZBar在扫描的灵敏度上,和内存的使用上相对于ZXing上都是较优的,但是对于 “圆角二维码” 的扫描确很困难. ZXing 是 Google Code上的一个开源的条形码扫描库,是用java设计的,连Google Glass 都在使用的.但有人为了追求更高效率以及可移植性,出现了c++ port. Github上的Objectivc-C port,其实就是用OC代码封装了一下而已,而且已经停止维护.这样