侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

原生二维码的生成与扫描.

2024-05-10 星期五 / 0 评论 / 0 点赞 / 86 阅读 / 5232 字

:full_moon_with_face:良心整理,希望看官老爷喜欢.2333二维码的生成.//生成二维码图片 CIFilter *filter = [CIFilter filterWithNa

:full_moon_with_face:良心整理,希望看官老爷喜欢.2333

二维码的生成.

//生成二维码图片    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];    //2.恢复滤镜的默认属性(因为滤镜有可能保存上一次的属性)    [filter setDefaults];    //3.经字符串转化成NSData    NSData *data = [[EMClient sharedClient].currentUsername dataUsingEncoding:NSUTF8StringEncoding];    //4.通过KVC设置滤镜,传入data,将来滤镜就知道要通过传入的数据生成二维码    [filter setValue:data forKey:@"inputMessage"];    //5.生成二维码    CIImage *image = [filter outputImage];    //CIImage是CoreImage框架中最基本代表图像的对象,他不仅包含元图像数据,还包含作用在原图像上的滤镜链。    self.imageOfQR.image = [UIImage imageWithCIImage:image];     self.imageOfQR.image = [self createNonInterpolatedUIImageFormCIImage:image withSize:100.0];
- (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];}

二维码的扫描(原生二维码)

  1. 导入avfoundation框架, 签 AVCaptureMetadataOutputObjectsDelegate协议

  2. 定义以下全局变量.

@property (strong,nonatomic)AVCaptureDevice * device;//是AVCaptureInput的子类,可以作为输入捕获会话,用AVCaptureDevice实例初始化。@property (strong,nonatomic)AVCaptureDeviceInput * input;//是AVCaptureOutput的子类,处理输出捕获会话@property (strong,nonatomic)AVCaptureMetadataOutput * output;//管理输入(AVCaptureInput)和输出(AVCaptureOutput)流,包含开启和停止会话方法。@property (strong,nonatomic)AVCaptureSession * session;@property (strong,nonatomic)AVCaptureVideoPreviewLayer * preview;@property (nonatomic, assign)BOOL lastResult;
  1. 创建设备,输入输出流等.
// Device    _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];    // Input    _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];    // Output    _output = [[AVCaptureMetadataOutput alloc]init];    [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];    // Session    _session = [[AVCaptureSession alloc]init];    [_session setSessionPreset:AVCaptureSessionPresetHigh];    //连接输入和输出    if ([_session canAddInput:self.input]) {        [_session addInput:self.input];    }    if ([_session canAddOutput:self.output]) {        [_session addOutput:self.output];    }    //设置条形码类型    _output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];    //添加扫描画面    _preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];    _preview.videoGravity = AVLayerVideoGravityResizeAspectFill;    //相机范围.    _preview.frame = CGRectMake([UIScreen mainScreen].bounds.size.width / 2 - 150, [UIScreen mainScreen].bounds.size.height / 2 - 175, 300, 350);    [self.view.layer insertSublayer:_preview atIndex:0];    [_session startRunning];

4.停止扫描

- (void)stopReading {    [_session stopRunning];    _session = nil;}

5.扫描二维码

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {    if (metadataObjects != nil && [metadataObjects count] > 0) {        AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];        NSString *result;        if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {            result = metadataObj.stringValue;           //实现页面跳转.        } else {            NSLog(@"不是二维码");        }        [self performSelectorOnMainThread:@selector(reportScanResult:) withObject:result waitUntilDone:NO];    }}- (void)reportScanResult:(NSString *)result {    [self stopReading];    if (!_lastResult) {        _lastResult = NO;        return;    }    else{        //以下处理了结果,继续下次扫描        _lastResult = YES;    }}

广告 广告

评论区