iOS-AVFoundation二维码扫描,二维码扫描,图片的无损放大
2016-07-15 00:12
531 查看
二维码扫描
扫描实现思路
二维码实现思路输入设备(用来获取外界信息) 摄像头, 麦克风, 键盘
输出设备 (将收集到的信息, 做解析, 来获取收到的内容)
会话session (用来连接输入和输出设备)
特殊的layer (展示输入设备所采集的信息)
下面上代码:
//
// ViewController.m
// 二维码
//
// Created by VolitationXiaoXing on 15/12/17.
// Copyright © 2016年 dream. All rights reserved.
//
#import "ViewController.h" #import <AVFoundation/AVFoundation.h> #import "HMPreView.h" @interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate> //1. 输入设备(用来获取外界信息) 摄像头, 麦克风, 键盘 @property (nonatomic, strong) AVCaptureDeviceInput *input; //2. 输出设备 (将收集到的信息, 做解析, 来获取收到的内容) @property (nonatomic, strong) AVCaptureMetadataOutput *output; //3. 会话session (用来连接输入和输出设备) @property (nonatomic, strong) AVCaptureSession *session; //4. 特殊的layer (展示输入设备所采集的信息) //@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer; @property (nonatomic, strong) HMPreView *preview; @property (weak, nonatomic) IBOutlet UILabel *label; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } #pragma mark 点击屏幕开始扫描 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //1.输入设备(用来获取外界信息) 摄像头, 麦克风, 键盘 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; self.input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; //2.输出设备 (将收集到的信息, 做解析, 来获取收到的内容) self.output = [AVCaptureMetadataOutput new]; //3.会话session (用来连接输入和输出设备) self.session = [AVCaptureSession new]; // 会话扫描展示的大小 [self.session setSessionPreset:AVCaptureSessionPresetHigh]; // 会话跟输入和输出设备关联 if ([self.session canAddInput:self.input]) { [self.session addInput:self.input]; } if ([self.session canAddOutput:self.output]) { [self.session addOutput:self.output]; } //下面两句代码应该写在此处 //制定输出设备的代理, 用来接受返回的数据 [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; //设置元数据类型 二维码QRCode [self.output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]]; //4.特殊的layer (展示输入设备所采集的信息) //self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session]; // 大小layer的大小 //self.previewLayer.frame = self.view.bounds; //[self.view.layer addSublayer:self.previewLayer]; //这个View是一个自定义的View,就是中间一个正方形,中间有一个线上下扫动 self.preview = [[HMPreView alloc] initWithFrame:self.view.bounds]; self.preview.session = self.session; [self.view addSubview:self.preview]; //5. 启动会话 [self.session startRunning]; } /** captureOutput : 输出设备 metadataObjects : 元数据对象的数组 connection : 连接 */ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { //1. 停止会话 [self.session stopRunning]; //2. 删除layer //[self.previewLayer removeFromSuperlayer]; [self.preview removeFromSuperview]; //3. 遍历数据获取内容 for (AVMetadataMachineReadableCodeObject *obj in metadataObjects) { //NSLog(@"obj: %@",obj.stringValue); self.label.text = obj.stringValue; } } @end
生成二维码
下面是生成二维码的代码,包括了无损放大图片// // ViewController.m // QRCodeCreat // // Created by VolitationXiaoXing on 16/7/14. // Copyright © 2016年 itcast. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imgView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; [filter setDefaults]; NSData *data = [@"这个是二维码中的数据" dataUsingEncoding:NSUTF8StringEncoding]; [filter setValue:data forKey:@"inputMessage"]; //设置容错率 [filter setValue:@"H" forKey:@"inputCorrectionLevel"]; CIImage *coreImage = [filter outputImage]; // 1.无损放大图片 UIImage *QRImage = [self imageWithCIImage:coreImage andSize:self.imgView.bounds.size]; // 2.合并头像 CGSize headSize = CGSizeMake(self.imgView.bounds.size.width * 0.3, self.imgView.bounds.size.height * 0.3); UIImage *overImage = [self imageWithBackgroundImage:QRImage centerImage:[UIImage imageNamed:@"head"] centerImageSize:headSize]; self.imgView.image = overImage; } // 1.无损放大图片这里用到了CIImage与CGImage与UIImage转换 - (UIImage *)imageWithCIImage:(CIImage *)coreImage andSize:(CGSize)size{ // 1.CIImage --> CGImage CIContext *tempContext = [CIContext contextWithOptions:nil]; CGImageRef originCGImage = [tempContext createCGImage:coreImage fromRect:coreImage.extent]; // 2.创建和size一样大的图形上下文(Bitmap) CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray(); CGContextRef bitmapCtx = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, cs, kCGImageAlphaNone); // 3.CGImage 渲染到上下文中 CGContextSetInterpolationQuality(bitmapCtx, kCGInterpolationNone); CGContextDrawImage(bitmapCtx, CGRectMake(0, 0, size.width, size.height), originCGImage); // 4.将图形上下文中的图像取出来 CGImageRef QRImage = CGBitmapContextCreateImage(bitmapCtx); // 释放 // return return [UIImage imageWithCGImage:QRImage]; } // 2.合并头像 - (UIImage *)imageWithBackgroundImage:(UIImage *)backgroundImage centerImage:(UIImage *)centerImage centerImageSize:(CGSize)centerSize{ // 1.开启图形上下文 UIGraphicsBeginImageContext(backgroundImage.size); // 2.先画背景 [backgroundImage drawAtPoint:CGPointZero]; // 3.画头像 CGFloat headW = centerSize.width; CGFloat headH = centerSize.height; CGFloat headX = (backgroundImage.size.width - headW) * 0.5; CGFloat headY = (backgroundImage.size.width - headH) * 0.5; [centerImage drawInRect:CGRectMake(headX, headY, headW, headH)]; // 4.取图像 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } @end
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 马化腾亲自“站台” 企业微信和个人微信互通能带来什么?
- 按右键另存图片只能存BMP
- photoshop去除图片上的水印
- upload上传单张图片
- 图片引发的溢出危机(图)
- C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法
- C#实现把彩色图片灰度化代码分享
- C#将图片和字节流互相转换并显示到页面上
- C#监控文件夹并自动给图片文件打水印的方法
- 纯CSS实现的当鼠标移上图片添加阴影效果代码
- 如何使用C#从word文档中提取图片
- C#实现打开画图的同时载入图片、最大化显示画图窗体的方法
- C#图片添加水印的实现代码