二维码的生成在iOS开发中是非常常见的一个需求,我刚刚到公司的时候发现项目这部分是找的网上的C代码实现的。其实在iOS7中又提供了CIQRCodeGenerator的CIFilter,通过这个CIFilter我们可以很容易的生成一张二维码。我的思路就是写一个UIImage分类,通过传入一个字符和一个二维码的大小,然后生成一张图片。如果你要对二维码进一步处理,你可以修改分类,也可以在获得二维码图片后继续处理。
/**
* 根据字符串生成二维码图片
*
* @param code 二维码code
* @param size 生成图片大小
*
* @return
*/
+ (UIImage *)jy_QRCodeFromString:(NSString *)code size:(CGFloat)size{
//创建CIFilter 指定filter的名称为CIQRCodeGenerator
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
//指定二维码的inputMessage,即你要生成二维码的字符串
[filter setValue:[code dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
//输出CIImage
CIImage *ciImage = [filter outputImage];
//对CIImage进行处理
return [self createfNonInterpolatedImageFromCIImage:ciImage withSize:size];
}
/**
* 对CIQRCodeGenerator 生成的CIImage对象进行不插值放大或缩小处理
*
* @param iamge 原CIImage对象
* @param size 处理后的图片大小
*
* @return
*/
+ (UIImage *) createfNonInterpolatedImageFromCIImage:(CIImage *)iamge withSize:(CGFloat)size{
CGRect extent = iamge.extent;
CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
size_t with = scale * CGRectGetWidth(extent);
size_t height = scale * CGRectGetHeight(extent);
UIGraphicsBeginImageContext(CGSizeMake(with, height));
CGContextRef bitmapContextRef = UIGraphicsGetCurrentContext();
CIContext *context = [CIContext contextWithOptions:nil];
//通过CIContext 将CIImage生成CGImageRef
CGImageRef bitmapImage = [context createCGImage:iamge fromRect:extent];
//在对二维码放大或缩小处理时,禁止插值
CGContextSetInterpolationQuality(bitmapContextRef, kCGInterpolationNone);
//对二维码进行缩放
CGContextScaleCTM(bitmapContextRef, scale, scale);
//将二维码绘制到图片上下文
CGContextDrawImage(bitmapContextRef, extent, bitmapImage);
//获得上下文中二维码
UIImage *retVal = UIGraphicsGetImageFromCurrentImageContext();
CGImageRelease(bitmapImage);
CGContextRelease(bitmapContextRef);
return retVal;
}
![](https://img.haomeiwen.com/i1796480/432364b500bad6e1.png)
网友评论