iOS应用之 二维码

系统方法 CIFilter

1、系统生成的二维码,原始image较小,图片模糊

- (UIImage *)generateORCodeFromString:(NSString *)string{
    //1. 需要⽣生成⼆二维码的内容
    NSData *stringData = [string dataUsingEncoding:NSUTF8StringEncoding ];
    //2. ⼆二维码⽣生成器
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    //3. 设置输⼊入参数
    [filter setValue:stringData forKey:@"inputMessage"]; //4. 设置识别率
    [filter setValue:@"M" forKey:@"inputCorrectionLevel"];
    //5. 获取⽣生成的图⽚片
    CGImageRef cgImage = [[CIContext contextWithOptions:nil]
                          createCGImage:[filter outputImage]
                          fromRect:[[filter outputImage]extent]];
    return [UIImage imageWithCGImage:cgImage];
}

2、可通过画图的方式优化

- (UIImage *)image:(UIImage *)image scale:(CGFloat)scale {
    CGSize size = image.size;
    //1. 缩放图⽚片,使⽣生成的⼆二维码变得更清晰
    UIGraphicsBeginImageContext(CGSizeMake(size.width * scale, size.width *scale));
    CGContextRef context = UIGraphicsGetCurrentContext();
    //2. 插值
    CGContextSetInterpolationQuality(context, kCGInterpolationNone); //3. 绘制图⽚片
    CGContextDrawImage(context, CGContextGetClipBoundingBox(context),image.CGImage);
    //4. 获取图⽚片
    UIImage *preImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    //5. 旋转图⽚片
    UIImage *qrImage = [UIImage imageWithCGImage:[preImage CGImage]
                                           scale:[preImage scale]
                                     orientation:UIImageOrientationDownMirrored];
    return qrImage;
}

ZBarSDK 第三方框架,用于识别二维码的UIImage文件

- (void)scanImage:(UIImage *)image {
    //1. 需要识别的图⽚片对象
    ZBarImage *zImage = [[ZBarImage alloc]
                         initWithCGImage:image.CGImage]; //2. 图⽚片识别器
    ZBarImageScanner *imageScanner = [[ZBarImageScanner alloc]
                                      init];
    //3. 识别图⽚片⼆二维码
    [imageScanner scanImage:zImage];
    //4. 获取⼆二维码信息
    for (ZBarSymbol *symbol in zImage.symbols) {
        NSLog(@"%@", symbol.data);
    }
}

AVFoundation通过摄像头来扫描二维码

1、输入设备

- (void)AVCaptureInput{
    //1. 输⼊入设备
    AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:nil];
    if (!input) {
        return; }
    _captureSession = [[AVCaptureSession alloc]init];
    //2. 添加输⼊入设备
    [_captureSession addInput:input];
}

2、输出设备

- (void)AVCaptureOutput{
    //3. 输出设备
    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
    dispatch_queue_t queue = dispatch_get_main_queue();
    //4. 添加输出
    [_captureSession addOutput:output];
    //设置代理,识别后调⽤用
    [output setMetadataObjectsDelegate:self queue:queue];   //5. 可⽤用的数据类型
    NSLog(@"%@", output.availableMetadataObjectTypes);      //6. 识别QRCode
    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
}

3、显示预览

- (void)displayScan{
    AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_captureSession];
    previewLayer.frame = CGRectMake(100, 100, 200, 200);
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    [self.view.layer addSublayer:previewLayer];

    //开始识别
    [_captureSession startRunning];
}

3、delegate 会在扫描完成后自动调用

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
    NSLog(@"%@", metadataObjects);
}

代码github网址

https://github.com/WeizhStudy/ORCode.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值