二维码生成

来源:互联网 发布:java 初级项目 编辑:程序博客网 时间:2024/05/18 01:45

使用CIFilter可以不引入任何第三方库,就可以生成想要的二维码和条形码,今天简单的介绍一下使用CIFilter生成二维码和条形码。系统CIFilter生成的二维码和条形码的大小有时并不能满足需求,直接使用起来,二维码图片看起来有些模糊,这就需要我们手动的根据目标大小重新生成清晰的二维码和条形码。

1.生成二维码(iOS7.0以上支持)

/** *  生成二维码 */- (IBAction)generateQRCode:(id)sender {    CIImage *ciImage = [self generateQRCodeImage:@"http://www.baidu.com"];    _qRCodeImageView.image = [self resizeCodeImage:ciImage withSize:CGSizeMake(200, 200)];}/** *  二维码图片 * *  @param source * *  @return CIImage 对象 */- (CIImage *)generateQRCodeImage:(NSString *)source{    NSData *data = [source dataUsingEncoding:NSUTF8StringEncoding];    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];    [filter setValue:data forKey:@"inputMessage"];    [filter setValue:@"Q" forKey:@"inputCorrectionLevel"];    return filter.outputImage;}

2. 生成条形码 (iOS8.0以上 支持)

/** *  生成条形码 */- (IBAction)generateBarCode:(id)sender {    CIImage *ciImage = [self generateBarCodeImage:@"1234567890"];    UIImage *image = [self resizeCodeImage:ciImage withSize:CGSizeMake((self.view.frame.size.width - 80), 80)];    _barCodeImageView.image = image;}/** *  生成条形码 * *  @param source * *  @return 生成条形码的CIImage对象 */- (CIImage *) generateBarCodeImage:(NSString *)source{    // iOS 8.0以上的系统才支持条形码的生成,iOS8.0以下使用第三方控件生成    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {       // 注意生成条形码的编码方式        NSData *data = [source dataUsingEncoding: NSASCIIStringEncoding];        CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];        [filter setValue:data forKey:@"inputMessage"];       // 设置生成的条形码的上,下,左,右的margins的值        [filter setValue:[NSNumber numberWithInteger:0] forKey:@"inputQuietSpace"];        return filter.outputImage;    }else{        return nil;    }}

3. 生成自定义的二维码和条形码的大小

/** *  调整生成的图片的大小 * *  @param image CIImage对象 *  @param size  需要的UIImage的大小 * *  @return size大小的UIImage对象 */- (UIImage *) resizeCodeImage:(CIImage *)image withSize:(CGSize)size{    if (image) {        CGRect extent = CGRectIntegral(image.extent);        CGFloat scaleWidth = size.width/CGRectGetWidth(extent);        CGFloat scaleHeight = size.height/CGRectGetHeight(extent);        size_t width = CGRectGetWidth(extent) * scaleWidth;        size_t height = CGRectGetHeight(extent) * scaleHeight;        CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();        CGContextRef contentRef = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpaceRef, (CGBitmapInfo)kCGImageAlphaNone);        CIContext *context = [CIContext contextWithOptions:nil];        CGImageRef imageRef = [context createCGImage:image fromRect:extent];        CGContextSetInterpolationQuality(contentRef, kCGInterpolationNone);        CGContextScaleCTM(contentRef, scaleWidth, scaleHeight);        CGContextDrawImage(contentRef, extent, imageRef);        CGImageRef imageRefResized = CGBitmapContextCreateImage(contentRef);        CGContextRelease(contentRef);        CGImageRelease(imageRef);        return [UIImage imageWithCGImage:imageRefResized];    }else{        return nil;    }}

4.运行结果


二维码和条形码.png

以上就是使用iOS系统原生的CIFilter生成二维码和条形码,对于生成二维码和条形码时,CIFilter的参数的定义可以参考官方文档。

0 0