iOS CIQRCodeGenerator(二维码生成器)的使用和参数介绍

12 篇文章 0 订阅
//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个边角矩形框(这三个小方块就是二维码位置信息,用于定位二维码位置)的任意位置贴上想要的图标即可,只要图标面积不超过容错率上限都可以被识别。  

                                                                                                                                                   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值