识别二维码的步骤
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写法的链接 请留给我 万分感谢
网友评论