//MARK: 生成二维码 可设置带居中的icon图标
+ (UIImage *)qrCodeInfo:(NSString *)info width:(float)width iconImage:(UIImage *)iconImage{
CIImage *imageCI = [self getQRCode:info];
UIImage *imageQR = [self resizeQRCodeImage:imageCI withSize:width];
if (iconImage) {//有小图标需要写入
UIGraphicsBeginImageContext(imageQR.size);
[imageQR drawInRect:CGRectMake(0, 0, imageQR.size.width, imageQR.size.height)];
//当前配置的容错率是15% 保险起见写入小图标只占12%
float iconWidth = imageQR.size.width * 0.14;
[iconImage drawInRect:CGRectMake((imageQR.size.width - iconWidth) * 0.5, (imageQR.size.height - iconWidth) * 0.5, iconWidth, iconWidth)];
imageQR = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
return imageQR;
}
//MARK: 生成一个二维码图片
- (CIImage *)getQRCode:(NSString *)constent{
//创建二维码滤镜
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
[filter setDefaults];
NSData *strData = [constent dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:strData forKeyPath:@"inputMessage"];
[filter setValue:@"M" forKeyPath:@"inputCorrectionLevel"];
//生成二维码
CIImage *outputImage = [filter outputImage];
return outputImage;
}
//MARK: 重新生成固定大小的二维码图片
+ (UIImage *)resizeQRCodeImage:(CIImage *)image withSize:(CGFloat)size{
CGRect extent = CGRectIntegral(image.extent);
CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
size_t width = CGRectGetWidth(extent) * scale;
size_t height = CGRectGetHeight(extent) * scale;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();
CGContextRef contextRef = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpaceRef, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef imageRef = [context createCGImage:image fromRect:extent];
CGContextSetInterpolationQuality(contextRef, kCGInterpolationNone);
CGContextScaleCTM(contextRef, scale, scale);
CGContextDrawImage(contextRef, extent, imageRef);
CGImageRef imageRefResized = CGBitmapContextCreateImage(contextRef);
//Release
CGContextRelease(contextRef);
CGImageRelease(imageRef);
CGColorSpaceRelease(colorSpaceRef);
UIImage *theImage = [UIImage imageWithCGImage:imageRefResized];
CFRelease(imageRefResized);
return theImage;
}
输出图像的标准:ISO/IEC 18004:2006标准
inputMessage:二维码的内容
inputCorrectionLevel:二维码的容错率 一共可以分为4个级别,默认是 M;
L
:7%
M
:15%
Q
:25%
H
:30%
容错率表示,二维码最多被遮挡多少面积依旧能被识别。 所以我们可以自己制作带图标的二维码,生成普通的二维码直接在除3个边角矩形框(这三个小方块就是二维码位置信息,用于定位二维码位置)的任意位置贴上想要的图标即可,只要图标面积不超过容错率上限都可以被识别。