在如今的开发中经常会遇到二维码生成和二维码读取很是识别的需求网上也有一些封装好的第三方的,但是楼主还是觉得自己写一遍能加深理解,于是楼主花了点空闲时间整理查看了二维码相关的一些知识,分享给需要的盆友.
1 二维码生成
废话不多说先上代码
//通过CIFilter创建二维码
//使用CIFilter很简单,直接传入生成二维码的字符串即可 生成CIImage对象
-(CIImage)createQRImageWithString:(NSString)qrString
{
//先编码 成NSData
NSData* data=[qrString dataUsingEncoding:(NSUTF8StringEncoding)];
//创建CFFliter 实例
//CIImage 是Core Image的图片数据类
//CIFilter是 Core Image滤镜类
CIFilter* filter=[CIFilter filterWithName:@"CIQRCodeGenerator"];
//设置内容
[filter setValue:data forKey:@"inputMessage"];
//设置纠错级别
[filter setValue:@"H" forKey:@"inputCorrectionLevel"];
//[filter setDefaults];
return filter.outputImage;
}
//调整大小并且转换成UIImage类型
-(UIImage )resetCodeImage:(CIImage)image WithSize:(CGSize)size
{
//获取图片数据
CGRect extent=CGRectIntegral(image.extent);
//宽度比例
CGFloat scaleWidth=size.width/CGRectGetWidth(extent);
//高度比例
CGFloat scaleHeight =size.height/CGRectGetHeight(extent);
CGFloat scale = MIN( scaleWidth, scaleHeight);
// 创建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:@{kCIContextUseSoftwareRenderer : @(YES)}];
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];
}
//调用方法 self.qrView为一个ImageView
//生成二维码图片
-(void)makeImage
{
CIImage* image=[self createQRImageWithString:@"http://www.baidu.com"];
CGSize size=CGSizeMake(100, 100);
UIImage* img= [self resetCodeImage:image WithSize:size];
self.qrView.image=img;
}
效果图
2 二维码读取和识别
-
(IBAction)readClick:(UIButton *)sender {
//识别二维码
UIImage *im=self.readImage.image;NSArray *array = [self readQRCodeInfoWithImage:im];
// 显示二维码中的信息
NSMutableString *str = [[NSMutableString alloc] init];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
CIQRCodeFeature *temp = (CIQRCodeFeature *)obj;
[str appendFormat:@"地址:%@",temp.messageString];
}];
NSLog(@"-----信息 ---%@",str);
}
结果和截图
2017-09-25 14:57:01.210824+0800 二维码生成与读取[3594:1340486] 获取到的features = (
"<CIQRCodeFeature: 0x6040000dcaf0>"
)
2017-09-25 14:57:01.211148+0800 二维码生成与读取[3594:1340486] +++++msg = http://www.baidu.com
2017-09-25 14:57:01.211353+0800 二维码生成与读取[3594:1340486] -----信息 ---地址:http://www.baidu.com