iOS_使用CIFilter滤镜类生成清晰二维码

生活中我们每天都会见到二维码,那么二维码是什么意思呢?简单来讲,二维码是将某个数据信息转化为了二进制,即0和1的组合,在一个完整的二维码图像中,黑色小方块就代表着1,白色小方块就代表着0,数据不相同,那么0和1的组合情况就会不一样,也就会生成不同的二维码图像。如果你仔细观察过二维码,你会发现二维码有三个角有大一点的方框区域,只有右下角没有,这三个角是为了让相机判断方向的,有了这个无论从哪个方向扫描二维码都会得到唯一的一个数据信息。接下来我们看一下如何用代码实现二维码图像的生成:
#pragma mark -- 使用给定的字符串获得CIImage类型的对象
- (CIImage *)getImageByString:(NSString *)dataString
{
    //首先判断字符串是否合理!
    if (!dataString || dataString == nil || [dataString isEqualToString:@""])
    {
        return nil;
    }
    //实例化一个滤镜对象
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    //1、设置filter的默认值,防止之前的设置对本次转化有影响
    [filter setDefaults];

    //2、将传入的字符串转换为NSData
    NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
    
    //3、将NSData传递给滤镜(通过KVC的方式,设置inputMessage)
    [filter setValue:data forKey:@"inputMessage"];
    
    //4、由filter对象输出图像
    CIImage *outputImage = [filter outputImage];
    
    //5、返回二维码图像
    return outputImage;
}
#pragma mark -- 对图像进行清晰处理,很关键!
- (UIImage *)excludeFuzzyImageFromCIImage: (CIImage *)image size: (CGFloat)size

{
    
    CGRect extent = CGRectIntegral(image.extent);
    
    //通过比例计算,让最终的图像大小合理(正方形是我们想要的)
    CGFloat scale = MIN(size / CGRectGetWidth(extent), size / CGRectGetHeight(extent));
    
    size_t width = CGRectGetWidth(extent) * scale;
    
    size_t height = CGRectGetHeight(extent) * scale;
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    
    CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpace, (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);
    
    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
    
    //切记ARC模式下是不会对CoreFoundation框架的对象进行自动释放的,所以要我们手动释放
    CGContextRelease(bitmapRef);
    
    CGImageRelease(bitmapImage);
    
    CGColorSpaceRelease(colorSpace);
    
    return [UIImage imageWithCGImage: scaledImage];
}

具体使用如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    imageView.center = self.view.center;
    [self.view addSubview:imageView];
    CIImage *ciImage = [self getImageByString:@"http://www.jianshu.com/users/be2c0f5976c1/latest_articles"];
    imageView.image = [self excludeFuzzyImageFromCIImage:ciImage size:200];
}

效果如下:

iOS_使用CIFilter滤镜类生成清晰二维码_第1张图片
CoderDoctorLee 欢迎扫描
备注:后续会添加上对于二维码图像的一些修饰性操作,如添加个性小图片(参考微信),改变颜色等。

你可能感兴趣的:(iOS_使用CIFilter滤镜类生成清晰二维码)