圖片發(fā)自簡(jiǎn)書App
#import "SaoYiSaoController.h"
#import <AVFoundation/AVFoundation.h>
#import "SaoMaTiaoZhuanController.h"
@interface SaoYiSaoController ()<AVCaptureMetadataOutputObjectsDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
@property (nonatomic ,strong) AVCaptureSession *captureSession;
@property (nonatomic ,strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;
@end
@implementation SaoYiSaoController
- (void)viewWillAppear:(BOOL)animated{
//開始掃碼
[self.captureSession startRunning];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// Do any additional setup after loading the view.
[self createSaoMiaoErWeiMa];
UIBarButtonItem *ri = [[UIBarButtonItem alloc]initWithTitle:@"相冊(cè)" style:UIBarButtonItemStylePlain target:self action:@selector(xiangCe)];
[self.navigationItem setRightBarButtonItem:ri];
//創(chuàng)建掃碼框
UIImageView *imgV = [[UIImageView alloc]initWithFrame:CGRectMake(kWidth/2-100, kHeight/2-100, 200, 200)];
imgV.image = [UIImage imageNamed:@"5b2c3a1c9b1488596cc1faf53c35fbd0.png"];
[self.view addSubview:imgV];
}
- (void)createSaoMiaoErWeiMa{
//初始化捕捉設(shè)備AVCaptureDevice
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
//創(chuàng)建輸入
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:nil];
if (!input) {
return;
}
//創(chuàng)建輸出
AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
//創(chuàng)建一個(gè)會(huì)話祥山,并添加輸入和輸出
self.captureSession = [[AVCaptureSession alloc] init];
[self.captureSession addInput:input];
[self.captureSession addOutput:captureMetadataOutput];
//設(shè)置為二維碼類型
[captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];
//創(chuàng)建圖層,攝像頭捕捉到的畫面都會(huì)在這個(gè)圖層顯示
self.videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];
//設(shè)置圖層填充方式
[self.videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
// 設(shè)置圖層的frame
[self.videoPreviewLayer setFrame:self.view.layer.bounds];
//將圖層添加到預(yù)覽view的圖層上
[self.view.layer addSublayer:self.videoPreviewLayer];
//創(chuàng)建一個(gè)串行隊(duì)列匹中,并設(shè)置代理
dispatch_queue_t dispatchQueue;
dispatchQueue = dispatch_queue_create("myQueue", NULL);
[captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];
//設(shè)置掃碼范圍
captureMetadataOutput.rectOfInterest = CGRectMake((kHeight/2-100)/kHeight,
kWidth/2/kHeight,
200/kHeight,
200/kWidth);
}
#pragma mark - 掃碼完成后調(diào)用此方法
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
NSString *str;
//判斷是否有數(shù)據(jù)
if (metadataObjects != nil && [metadataObjects count] > 0) {
AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
//判斷回傳的數(shù)據(jù)類型
if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {
str = [metadataObj stringValue];
}
//跳轉(zhuǎn)
[self pushC:str];
//結(jié)束捕獲
[self.captureSession stopRunning];
}
}
#pragma mark - 打開系統(tǒng)相簿
- (void)xiangCe{
UIImagePickerController *photoPicker = [[UIImagePickerController alloc] init];
photoPicker.delegate = self;
//設(shè)置控制器類型系統(tǒng)相簿
photoPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
photoPicker.view.backgroundColor = [UIColor whiteColor];
[self presentViewController:photoPicker animated:YES completion:NULL];
}
//選取照片/視頻或拍照完成完成之后調(diào)用
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
//退出相簿控制器
[picker dismissViewControllerAnimated:NO completion:nil];
NSString *str;
//取出選中的圖片
UIImage *srcImage = [info objectForKey:UIImagePickerControllerOriginalImage];
//轉(zhuǎn)換為CIImage
CIImage *ciIma = [CIImage imageWithCGImage:srcImage.CGImage];
//創(chuàng)建探測(cè)器
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
NSArray *ary = [detector featuresInImage:ciIma];
//取出探測(cè)到的數(shù)據(jù)
for (CIQRCodeFeature *fe in ary) {
str = fe.messageString;
}
[self pushC:str];
}
#pragma mark - 跳轉(zhuǎn)控制器
- (void)pushC:(NSString *)str{
//跳轉(zhuǎn)控制器
self.hidesBottomBarWhenPushed = YES;
SaoMaTiaoZhuanController *smtz = [[SaoMaTiaoZhuanController alloc]init];
smtz.url = str;
dispatch_sync(dispatch_get_main_queue(), ^{
[self.navigationController pushViewController:smtz animated:YES];
});
}