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