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

来源:互联网 发布:如何删除mac系统 编辑:程序博客网 时间:2024/06/05 03:43

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;}