美文网首页iOS
iOS生成高清二维码

iOS生成高清二维码

作者: db6844a150fb | 来源:发表于2016-06-12 19:26 被阅读9390次

    iOS二维码生成

    ios7之前关于二维码的操作普遍使用第三方框架, 常用的有ZXing和ZBar
    ios7之后系统框架已经集成二维码的生成与读取, 这使开发变得方便很多, 并且会比第三方更加效率

    系统二维码主要通过CIFilter的对象来完成, 当然首先我们需要先导入这个类所在的框架:

    #import <CoreImage/CoreImage.h>
    

    之后只需要实例化一个CIFilter的对象, 给该对象添加数据后生成二维码即可

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        // 1. 创建一个二维码滤镜实例(CIFilter)
        CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
        // 滤镜恢复默认设置
        [filter setDefaults];
        
        // 2. 给滤镜添加数据
        NSString *string = @"are you ok?"
        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
        // 使用KVC的方式给filter赋值
        [filter setValue:data forKeyPath:@"inputMessage"];
        
        // 3. 生成二维码
        CIImage *image = [filter outputImage];
        
        // 4. 显示二维码
        self.imageView.image = [UIImage imageWithCIImage:image];
    }
    

    二维码中的数据可以是字符串和URL两种类型, 如果我们想要生成URL的二维码, 只需要把字符串替换为一个URL字符串即可

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        // 1. 创建一个二维码滤镜实例(CIFilter)
        CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
        // 滤镜恢复默认设置
        [filter setDefaults];
        
        // 2. 给滤镜添加数据
        NSString *string = @"http://www.jianshu.com/users/db6844a150fb/latest_articles"
        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
        
        [filter setValue:data forKeyPath:@"inputMessage"];
        
        // 3. 生成二维码
        CIImage *image = [filter outputImage];
        
        // 4. 显示二维码
        self.imageView.image = [UIImage imageWithCIImage:image];
    }
    

    此外, 我们经常看到中间带有图片的二维码, 其实只需要在二维码的imageView上再添加一个imageView即可, 当然图片不能太大, 否则会导致扫描不到二维码中的信息

    但这时候生成的二维码会比较模糊, 只需要使用下面的方法来获得一个清晰的image, 之后只要把image添加到二维码的imageView上即可

    - (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
        
        CGRect extent = CGRectIntegral(image.extent);
        CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
        
        // 1.创建bitmap;
        size_t width = CGRectGetWidth(extent) * scale;
        size_t height = CGRectGetHeight(extent) * scale;
        CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
        CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
        CIContext *context = [CIContext contextWithOptions:nil];
        CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
        CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
        CGContextScaleCTM(bitmapRef, scale, scale);
        CGContextDrawImage(bitmapRef, extent, bitmapImage);
        
        // 2.保存bitmap到图片
        CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
        CGContextRelease(bitmapRef);
        CGImageRelease(bitmapImage);
        return [UIImage imageWithCGImage:scaledImage];
    }
    

    相关文章

      网友评论

        本文标题:iOS生成高清二维码

        本文链接:https://www.haomeiwen.com/subject/zyredttx.html