iOS 7+,使用原生API生成QRCode。

iOS 7之后,可以通过原生API生成QRCode。

- (UIImage *)private_generateQRCodeImageWithContent:(NSString *)content {
    // 生成二维码
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    if (!filter) return nil;
    NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
    [filter setValue:data forKey:@"inputMessage"];
    [filter setValue:@"H" forKey:@"inputCorrectionLevel"];
    CIImage *qrCode = [filter outputImage];

    // 生成的二维码比较小,需要重新绘制
    CGRect CIImageRect = CGRectIntegral(qrCode.extent);
    CGFloat qrSizeToDraw = YBTRate * QRCodeWidth;
    CGFloat scale = MIN(qrSizeToDraw / CGRectGetWidth(CIImageRect), qrSizeToDraw / CGRectGetHeight(CIImageRect));

    size_t width = CGRectGetWidth(CIImageRect) * scale;
    size_t height = CGRectGetHeight(CIImageRect) * scale;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGContextRef bitmap = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpace, (CGBitmapInfo)kCGImageAlphaNone);
    CIContext * context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(NO)}];
    CGImageRef bitmapImage = [context createCGImage:qrCode fromRect:CIImageRect];

    CGContextSetInterpolationQuality(bitmap, kCGInterpolationNone);
    CGContextScaleCTM(bitmap, scale, scale);
    CGContextDrawImage(bitmap, CIImageRect, bitmapImage);

    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmap);
    CGColorSpaceRelease(colorSpace);
    CGContextRelease(bitmap);
    CGImageRelease(bitmapImage);

    UIImage * afterDrawingImage = [UIImage imageWithCGImage:scaledImage];

    // 绘制水印
    UIGraphicsBeginImageContext(afterDrawingImage.size);
    [afterDrawingImage drawInRect:(CGRect){CGPointZero, afterDrawingImage.size}];
    UIImage * logoImage = [UIImage imageNamed:@"二维码logo"]; // 水印图片
    [logoImage drawInRect:CGRectMake((afterDrawingImage.size.width - logoImage.size.width)/2, (afterDrawingImage.size.height - logoImage.size.height)/2, logoImage.size.width, logoImage.size.height)]; // 居中绘制
    UIImage * QRCodeImageWithLogo = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return QRCodeImageWithLogo;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值