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

相关文章

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

基于C#实现将图片转换为PDF文档

《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转