iOS-AVFoundation二维码扫描,二维码扫描,图片的无损放大

2024-01-13 21:08

本文主要是介绍iOS-AVFoundation二维码扫描,二维码扫描,图片的无损放大,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二维码扫描

扫描实现思路

  • 二维码实现思路

    1. 输入设备(用来获取外界信息) 摄像头, 麦克风, 键盘
    2. 输出设备 (将收集到的信息, 做解析, 来获取收到的内容)
    3. 会话session (用来连接输入和输出设备)
    4. 特殊的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 --> CGImageCIContext *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);//  释放// returnreturn [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

这篇关于iOS-AVFoundation二维码扫描,二维码扫描,图片的无损放大的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/602782

相关文章

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo