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

相关文章

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使