ios扫码应用总结
写了一个ios的关于扫码的应用,虽然简单,但是细节还是不少,写在这里,做一些总结,也提供给其他朋友作参考。
先来个界面看看:
1.本项目使用的是ios自带的AVFoundation库实现的扫码,没有导入任何第三方扫码库;
2.增加了捕获当前扫码图像的功能;
3.必须真机调试,否则崩溃;
4.上传的代码只有扫码部分,扫描结果页,其他模块未上传过,包含手动输入条形码,扫码结果页,列表页等,猿类自行增加吧;
细节:
1.扫描图像捕捉的实现,好多应用要实现扫描后可以把当前的扫描图保存起来,怎么弄呢?我的实现方式是使用AVCaptureStillImageOutput,在扫描完成后,获取当前的扫描图像,具体代买如下:
//初始化
stillImageOutput = [[AVCaptureStillImageOutput alloc]init];
NSDictionary* outputSettings = @{AVVideoCodecKey:AVVideoCodecJPEG};
[stillImageOutput setOutputSettings:outputSettings];
if ([self.session canAddOutput:stillImageOutput]) {
[self.session addOutput:stillImageOutput];
}
//以下代码在扫描结果方法captureOutput中调用
AVCaptureConnection *myVideoConnection = nil;
//从 AVCaptureStillImageOutput 中取得正确类型的 AVCaptureConnection
for (AVCaptureConnection *connection in stillImageOutput.connections) {
for (AVCaptureInputPort *port in [connection inputPorts]) {
if ([[port mediaType] isEqual:AVMediaTypeVideo]) {
myVideoConnection = connection;
break;
}
}
}
NSString* fileName = @"保存图像的名字";
//撷取影像(包含拍照音效)
[stillImageOutput captureStillImageAsynchronouslyFromConnection:myVideoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
//完成撷取时的处理程序(Block)
if (imageDataSampleBuffer) {
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
NSString* filePath = [NSString stringWithFormat:@"%@/%@.jpg",[iTools getDocumentDirectory],fileName];
//写文件到本地
}
}];
问题:
使用AVCaptureStillImageOutput获取图像有一个问题,就是会有快门声,如果你觉得快门声烦人,那建议采取另外一种方式,AVCaptureVideoDataOutput,视频流的方式进行截取,想尝试的同学自行实行吧;
2.结果页要用UIImageView显示扫描的图像,因为扫描图一般都是竖屏的,但是二维码要显示中间的正方形,两种方案,
(1)截图,将中间部分截取出来保存;
(2)UIImageView属性设置成Aspect Fill,但是刚开始一直得不到想要的结果,多余的图像无法实现遮罩,后来发现少了一个参数,self.titleImage.clipsToBounds = YES,设置clipsToBounds后完美解决;
上代码:demo下载