首页 > 作文

怎么扫二维码

更新时间:2023-03-09 17:43:20 阅读: 评论:0

创造教育-千岛湖住宿

怎么扫二维码
2023年3月9日发(作者:大班数学优质课)

⼆维码的⽣成,扫描,读取

⾸先这篇⽂章是出⾃⾥脊串的开发笔记

⼆维码的⽣成

⽣成⼆维码的步骤

1.传⼊⽣成⼆维码的字符串

NSString*text=@"";

//官⽅建议使⽤NSISOLatin1StringEncoding来编码,但经测试这种编码对中⽂或表情⽆法⽣成,

//改⽤NSUTF8StringEncoding就可以了

NSData*stringData=[textdataUsingEncoding:NSUTF8StringEncoding];

2创建CIFilter

CIFilter.滤镜类包含⼀个字典结构,对各种滤镜定义了属于他们各⾃的属性。滤镜有很多种,⽐如鲜艳程度滤镜,⾊彩反转滤镜,剪裁滤镜等等

⽣成⼆维码⽤到了CIQRCodeGenerator这种CIFilter。它有两个字段可以设置,inputMessage和inputCorrectionLevel

CIFilter*qrFilter=[CIFilterfilterWithName:@"CIQRCodeGenerator"];

设置内容和纠错级别

//inputMessage是⼀个NSData对象,可以是字符串也可以是⼀个URL。

[qrFiltertValue:stringDataforKey:@"inputMessage"];

inputCorrectionLevel是⼀个单字母(@"L",@"M",@"Q",@"H"中的⼀个),表⽰不同级别的容错率,默认为@"M"

QR码有容错能⼒,QR码图形如果有破损,仍然可以被机器读取内容,最⾼可以到7%~30%⾯积破损仍可被读取

相对⽽⾔,容错率愈⾼,QR码图形⾯积愈⼤。所以⼀般折衷使⽤15%容错能⼒。错误修正容量L⽔平7%的字码可被修正

M⽔平15%的字码可被修正

Q⽔平25%的字码可被修正

H⽔平30%的字码可被修正

所以很多⼆维码的中间都有头像之类的图⽚但仍然可以识别出来就是这个原因。

[qrFiltertValue:@"M"forKey:@"inputCorrectionLevel"];

3上⾊

上⾊(当然这⼀步不是必须的如果仅仅需要⽩底⿊块的QRCode可以跳过这⼀步)

UIColor*onColor=[UIColorredColor];

UIColor*offColor=[UIColorblueColor];

CIFilter*colorFilter=[CIFilterfilterWithName:@"CIFalColor"

keysAndValues:

@"inputImage",Image,

@"inputColor0",[CIColorcolorWithCGColor:r],

@"inputColor1",[CIColorcolorWithCGColor:r],

nil];

CIImage*qrImage=Image;

CGSizesize=CGSizeMake(300,300);

CGImageRefcgImage=[[CIContextcontextWithOptions:nil]createCGImage:qrImagefromRect:];

//创建⼀个基于位图的上下⽂(context),并将其设置为当前上下⽂(context)。

UIGraphicsBeginImageContext(size);

//设置上下⽂

CGContextRefcontext=UIGraphicsGetCurrentContext();

//背景内置颜⾊质量等级

CGContextSetInterpolationQuality(context,kCGInterpolationNone);

//反转画布,翻转⼀下图⽚不然⽣成的QRCode就是上下颠倒

CGContextScaleCTM(context,1.0,-1.0);

//画图⽚

CGContextDrawImage(context,CGContextGetClipBoundingBox(context),cgImage);

//最后⽆损放⼤并绘制QRCode(上⾯两步⽣成的QRCode很⼩⼤概是31*31如果不放⼤就会很模糊)

//对图⽚放⼤缩⼩的功能就是慢了点

UIImage*codeImage=UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

//需要释放内存,不然会引发内存泄露

CGImageRelea(cgImage);

=codeImage;

⼆维码的扫码

扫码是⼀个从摄像头(input)到解析出字符串(output)的过程,⽤AVCaptureSession来协调。其中是通过AVCaptureConnection来

连接各个input和output,还可以⽤它来控制input和output的数据流向

扫码的步骤

1.创建AVCaptureSession实例

AVCaptureSession是第⼀个要被创建的对象,所有的操作都要基于这⼀个ssion。创建它并没有什么特别的⽅法,使⽤init⽅法就可以。

//iOS提供的这⼀系列的类的功能实在强⼤,不过我还没有仔细研究过,就我⽬前已知道的功能,

//⽐如各种条码,声⾳录制,视频录制等。今天要说的扫描⼆维码就是AVCaptureSession中扫描条码的⼀个⼩功能

@property(strong,nonatomic)AVCaptureSession*ssion;

n=[[AVCaptureSessionalloc]init];

2.添加输⼊源

输⼊源对应的类是AVCaptureInput,该类是⼀个抽象类,不能被直接实例化,在实际使⽤中,都是使⽤他的⼦类,⽐如

AVCaptureDeviceInput,AVCaptureScreenInput(只能⽤于Mac),AVCaptureMetadataInput,⼀般情况下,我们是使⽤

AVCaptureDeviceInput,⽐如从设备的摄像头或者麦克风输⼊。AVCaptureDeviceInput的实例化⽅法如下

+(instancetype)deviceInputWithDevice:(AVCaptureDevice*)deviceerror:(NSError**)outError;

-(instancetype)initWithDevice:(AVCaptureDevice*)deviceerror:(NSError**)outError;

@property(strong,nonatomic)AVCaptureDeviceInput*input;

=[AVCaptureDeviceInputdeviceInputWithDevice:error:nil];

所以在创建AVCaptureDeviceInput之前,我们需要创建⼀个AVCaptureDevice对象

MeditaType定义在AVMediaFormat.h头⽂件下,如下所⽰:

AVF_EXPORTNSString*constAVMediaTypeVideoNS_AVAILABLE(10_7,4_0);

AVF_EXPORTNSString*constAVMediaTypeAudioNS_AVAILABLE(10_7,4_0);

AVF_EXPORTNSString*constAVMediaTypeTextNS_AVAILABLE(10_7,4_0);

AVF_EXPORTNSString*constAVMediaTypeClodCaptionNS_AVAILABLE(10_7,4_0);

AVF_EXPORTNSString*constAVMediaTypeSubtitleNS_AVAILABLE(10_7,4_0);

AVF_EXPORTNSString*constAVMediaTypeTimecodeNS_AVAILABLE(10_7,4_0);

AVF_EXPORTNSString*constAVMediaTypeMetadataNS_AVAILABLE(10_8,6_0);

AVF_EXPORTNSString*constAVMediaTypeMuxedNS_AVAILABLE(10_7,4_0);

我们这⾥只讲明如何扫描⼆维码,⾃然输⼊是从摄像头输⼊,因此我们只需要传⼊AVMediaTypeVideo即可。然后再调⽤AVCaptureSession

的addInput⽅法,将输⼊源添加到ssion当中即可

3.添加输出

输⼊的类是AVCaptureInput,那么输出的类相应的就应该是AVCaptureOutput,输出不需要和设备挂钩,因为⼀般情况下,我们的输出要么

是⾳频或视频⽂件,要么是⼀些其他的数据,像⼆维码扫描⼀般是字符串类型。所以创建AVCaptureOutput实例就不需要AVCaptureDevice对

象。

AVCaptureOutput也同样是⼀个抽象类,同样要使⽤其⼦类,在这⾥我们扫描⼆维码,使⽤的是AVCaptureMetadataOutput,设置代码如下

所⽰:

@property(strong,nonatomic)AVCaptureMetadataOutput*output;

=[[AVCaptureMetadataOutputalloc]init];

[tMetadataObjectsDelegate:lfqueue:dispatch_get_main_queue()];

设置代理,当扫描到数据的时候就会调⽤代理⽅法。

4.将输⼊输出添加

[ntSessionPret:([UIScreenmainScreen].<500)?AVCaptureSessionPret640x480:AVCaptureSessionPretHigh];

[naddInput:];

[naddOutput:];

taObjectTypes=@[AVMetadataObjectTypeQRCode];

只有在框中的⼆维码才会被扫描到不过其实改起来也很简单AVCaptureMetadataOutput有个属性rectOfInterest就是做这个事情的

//取景框的⼤⼩

CGSizewindowSize=[UIScreenmainScreen].;

CGSizescanSize=CGSizeMake(*3/4,*3/4);

CGRectscanRect=CGRectMake(()/2,()/2,,);

scanRect=CGRectMake(.y/,.x/,/,/window

Interest=scanRect;

//取景框

ctView=[UIViewnew];

[dSubview:ctView];

=CGRectMake(0,0,,);

=CGPointMake(CGRectGetMidX([UIScreenmainScreen].bounds),CGRectGetMidY([UIScreenmainScreen].bounds));

Color=[UIColorredColor].CGColor;

Width=1;

5.添加预览图层

预览图层的主要功能就是将摄像头采集的数据及时的传输到预览图层,使得⽤户可以在预览图层实时的看到画⾯,主要类是

AVCapturePreviewLayer,创建起来也⾮常容易,代码如下所⽰:

@property(strong,nonatomic)AVCaptureVideoPreviewLayer*preview;

w=[AVCaptureVideoPreviewLayerlayerWithSession:n];ravity=AVLayerVideoGravityResizeAspectFill;

=[UIScreenmainScreen].bounds;

[nrtSublayer:watIndex:0];

6.开始捕捉

如果这个时候你运⾏App,通过⼿机你可以看到其实是没有任何输出的,因为这⾥还少了⼀步,即开始捕捉,⼀切就绪之后⽤户调⽤

AVCaptureSession的StartRunning⽅法来启动捕捉ssion,代码如下:

[nstartRunning];

由于模拟器没有摄像头,⽤户必须以真机调试的⽅式才能看到实际情况。

7.结束捕捉

还记得吗?之前我们在创建输出源的时候设置了⼀个代理,当扫描到⼆维码的时候就会调⽤

captureOutput:didOutputMetadataObjects:fromConnection这个代理⽅法,在这个⽅法中,我们就可以获取到扫描到的⼆维码的数据了,

代码如下所⽰:

-(void)captureOutput:(AVCaptureOutput*)captureOutputdidOutputMetadataObjects:(NSArray*)metadataObjectsfromConnection:(AVCaptureConnection*)connection

[captureSessionstopRunning];AVMetadataMachineReadableCodeObject*metaData=(AVMetadataMachineReadableCodeObject*)metadataObjects[0];

dispatch_async(dispatch_get_main_queue(),^{[[[UIAlertViewalloc]initWithTitle:@"⼆维码内容"message:Valuedelegate:nilcancelButtonTitle:@"确定"other

});

return;}

本文发布于:2023-03-09 17:43:19,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678355000195877.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:怎么扫二维码.doc

本文 PDF 下载地址:怎么扫二维码.pdf

相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图