CoreImage之识别二维码

识别二维码的步骤

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) 不想看的可以略过


CoreImage之识别二维码_第1张图片
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 所以需要翻转上下文的坐标系来进行绘制


CoreImage之识别二维码_第2张图片
简单坐标系介绍

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*)

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


CoreImage之识别二维码_第3张图片
运行效果图

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

你可能感兴趣的:(CoreImage之识别二维码)