美文网首页
CoreImage之识别二维码

CoreImage之识别二维码

作者: 投降又不会赢 | 来源:发表于2016-09-16 20:49 被阅读326次

    识别二维码的步骤

    1、创建二维码探测器

    //识别率CIDetectorAccuracy  High 高
        //创建一个二维码探测器
        CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy : CIDetectorAccuracyHigh}];
    

    2、探测二维码特征

     UIImage *image = _sourceImageView.image;
        //探测二维码特征
        CIImage *ciImage = [[CIImage alloc]initWithImage:image];
        //返回值为数组
        NSArray * qrcodeFeatures = [detector featuresInImage:ciImage];
    

    ps:UIImage转CIImage不能使用image.CIImage 转换出来的对象为nil

    2.1、由于识别出来的为 [CIQRCodeFeature] 然后遍历

    for (CIQRCodeFeature *feature in qrcodeFeatures) {
            NSLog(@"%@",feature.messageString);
            //bounds是根据原始图片的位置来计算的
            NSLog(@"%@",NSStringFromCGRect(feature.bounds));
        }
    

    ps: 至此 已经可以读取出二维码了 顺便看一下(CIQRCodeFeature) 不想看的可以略过


    CIQRCodeFeature属性列表
    [messageString] 属性为读取出的字符串
    [bounds]属性是根据原始图片的坐标计算出来的frame
    

    2.2由于图中二维码数量过多 不知道识别出来的具体是哪几个二维码 所以根据bounds属性来进行绘制边框

    - (UIImage*)drawBorder:(UIImage*)image borderBounds:(CIQRCodeFeature*)feature{
        CGSize size = image.size;
        //开启图形上下文
        UIGraphicsBeginImageContext(size);
        //绘制大图片
        [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
        //绘制边框 因为识别出来的bounds坐标与ImageView的坐标系不同所以要翻转
        
        CGContextRef context = UIGraphicsGetCurrentContext();
        //翻转坐标系
        CGContextScaleCTM(context, 1, -1);
        CGContextTranslateCTM(context,0, -size.height);
        
        UIBezierPath *path = [UIBezierPath bezierPathWithRect:feature.bounds];
        [[UIColor greenColor] setStroke];
        path.lineWidth = 20;
        [path stroke];
        //获取返回图片
        UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
        //关闭图形上下文
        UIGraphicsEndImageContext();
        //返回图片
        return resultImage;
    }
    

    ps:由于bounds属性是根据图片原始位置的坐标系来计算的frame 所以需要翻转上下文的坐标系来进行绘制


    简单坐标系介绍

    2.3 在遍历数组时添加如下代码 绘制边框

        for (CIQRCodeFeature *feature in qrcodeFeatures) {
            NSLog(@"%@",feature.messageString);
            //bounds是根据原始图片的位置来计算的
            NSLog(@"%@",NSStringFromCGRect(feature.bounds));        
            resultImage =  [self drawBorder:resultImage borderBounds:feature];
            _sourceImageView.image = resultImage;
        }
    

    ps: resultImage 是为了避免多次遍历之后只显示一个边框 创建的中间变量(UIImage*)

    至此可以显示识别出来的二维码是哪几个了


    运行效果图

    闲暇之余顺便练习下markDown 能力有限 故不能解释太多 欢迎指教 如果您有好的markDown写法的链接 请留给我 万分感谢

    相关文章

      网友评论

          本文标题:CoreImage之识别二维码

          本文链接:https://www.haomeiwen.com/subject/tleiettx.html