//创建二维码
- (CIImage *)creatQRCodeForString:(NSString *)qrString {
NSData *stringData = [qrString dataUsingEncoding:NSUTF8StringEncoding];
//创建CIFilter
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
//设置内容 纠错级别
[filter setValue:stringData forKey:@"inputMessage"];
[filter setValue:@"M" forKey:@"inputCorrectionLevel"];
return filter.outputImage;
}
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
CGRect extent = CGRectIntegral(image.extent);
CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
// 创建bitmap;
size_t width = CGRectGetWidth(extent) * scale;
size_t height = CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
// 保存bitmap到图片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage imageWithCGImage:scaledImage];
}
//用到的类
@property (nonatomic, strong)AVCaptureSession *session;//会话对象
@property (nonatomic, strong)AVCaptureDeviceInput *inputDevice;//输入设备
@property (nonatomic, strong)AVCaptureMetadataOutput *output;//输出类
@property (nonatomic, strong)AVCaptureVideoPreviewLayer *layer;//图层类
- (AVCaptureSession *)session {
if (!_session) {
self.session = [[AVCaptureSession alloc] init];
[_session setSessionPreset:AVCaptureSessionPresetHigh];
if ([_session canAddInput:self.inputDevice]) {
[_session addInput:self.inputDevice];
}//注:要先添加输入设备,后添加输出设备,否则找不到metadataObjectType可用
if ([_session canAddOutput:self.output]) {
[_session addOutput:self.output];
_output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];
}
}
return _session;
}
- (AVCaptureDeviceInput *)inputDevice {
if (!_inputDevice) {
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
self.inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
}
return _inputDevice;
}
- (AVCaptureMetadataOutput *)output {
if (!_output) {
self.output = [[AVCaptureMetadataOutput alloc] init];
[_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
}
return _output;
}
- (AVCaptureVideoPreviewLayer *)layer {
if (!_layer) {
self.layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
_layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
_layer.frame = self.view.frame;
}
return _layer;
}
//添加到视图
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (status == AVAuthorizationStatusAuthorized) {
[self.view.layer insertSublayer:self.layer atIndex:0];
[self.session startRunning];
}
ios二维码生成和扫描
最新推荐文章于 2023-08-27 19:09:17 发布