最近手上的项目要添加扫码功能,用的阿里第三方的扫码工具,在调试过程中突然心血来潮想到巩固下二维码生成的技术代码,所以下面我们来使用原生的滤镜工具生成二维码。
首先引入CoreImage库
#import <CoreImage/CoreImage.h>
生成二维码需要使用到库中的CIFilter类(滤镜工具类),CIFilter可以生成除二维码以外的其他图形码,包括条形码、PDF等。
根据需要获取生成器所支持的图形列表:
NSArray *filterNames = [CIFilter filterNamesInCategory:kCICategoryGenerator];
NSLog(@"名称列表:%@",filterNames);
这里打印的日志如下:
名称列表:(
CIAttributedTextImageGenerator,
CIAztecCodeGenerator,
CIBarcodeGenerator,
CICheckerboardGenerator,
CICode128BarcodeGenerator,
CIConstantColorGenerator,
CILenticularHaloGenerator,
CIMeshGenerator,
CIPDF417BarcodeGenerator,
CIQRCodeGenerator,
CIRandomGenerator,
CIRoundedRectangleGenerator,
CIStarShineGenerator,
CIStripesGenerator,
CISunbeamsGenerator,
CITextImageGenerator
)
CIQRCodeGenerator才是生成二维码的所需要的。
然后可以编写核心代码,生成需要的二维码:
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
[filter setDefaults];
//这里是二维码信息
NSString*contentString =@"这里是二维码信息";
NSData *contentData = [contentString dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:contentData forKey:@"inputMessage"];
CIImage*outputImg = [filter outputImage];
UIImage *img = [UIImage imageWithCIImage:outputImg];//模糊的二维码图形
到此需要的二维码图片生成完毕,但生成的二维码图片过于模糊,所以需要进一步处理使图片更清晰。
//图片大小
CGSize size = CGSizeMake(200, 200);CGRectextent =CGRectIntegral(outputImg.extent);
CGFloat scale = MIN(size.width/CGRectGetWidth(extent), size.height/CGRectGetHeight(extent));
//创建bitmap;
size_twidth =CGRectGetWidth(extent) * scale;
size_theight =CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRefbitmapImage = [context createCGImage:outputImg fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
//保存bitmap到图片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
UIImage *img = [UIImage imageWithCGImage:scaledImage];//清晰的二维码图形
最后得到的就是清晰的二维码图片。
网友评论