美文网首页I love iOSiOS Tipsdemo
iOS_使用CIFilter滤镜类生成清晰二维码

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

作者: Mark_Ming | 来源:发表于2016-06-06 00:08 被阅读808次
生活中我们每天都会见到二维码,那么二维码是什么意思呢?简单来讲,二维码是将某个数据信息转化为了二进制,即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];
}

效果如下:

CoderDoctorLee 欢迎扫描
备注:后续会添加上对于二维码图像的一些修饰性操作,如添加个性小图片(参考微信),改变颜色等。

相关文章

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

    生活中我们每天都会见到二维码,那么二维码是什么意思呢?简单来讲,二维码是将某个数据信息转化为了二进制,即0和1的组...

  • iOS 生成二维码

    通过滤镜CIFilter生成二维码 调用示例:

  • iOS 生成二维码

    使用CIFilter来生成二维码图像 iOS常用滤镜参考 https://developer.apple.com/...

  • # QRCode二维码

    生成二维码图片 根据一个字符创生成一个二维码的图片 步骤和技术使用第一步:使用到滤镜(CIFilter类),其中在...

  • CoreImage(二)CIFilter滤镜效果使用

    CIFilter滤镜效果使用 CIFilter是使用CoreImage进行滤镜效果的核心类,通过这个类设置(KVC...

  • iOS 生成二维码和条形码

    使用 CIFilter类 的功能可以创建二维码和条形码 一、生成二维码: 新建 CIFilter 对象 : CIQ...

  • iOS中生成二维码

    生成二维码 1 导入CoreImage框架 #import 2 通过滤镜CIFilter生成二维码 /** * 生...

  • iOS技能要点

    1、生成二维码 创建滤镜对象(CIFilter) -> 恢复滤镜的默认属性 -> 设置数据(NSStrin...

  • 一键生成微信二维码

    引言 生成二维码的步骤导入CoreImage框架通过滤镜CIFilter生成二维码 生成普通的二维码 /** 生成...

  • 二维码

    二维码的生成 生成二维码 //1. 实例化二维码滤镜CIFilter*filter = [CIFilterfilt...

网友评论

本文标题:iOS_使用CIFilter滤镜类生成清晰二维码

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