美文网首页
iOS 生成二维码

iOS 生成二维码

作者: WSonglin | 来源:发表于2018-08-15 16:52 被阅读0次

通过滤镜CIFilter生成二维码

/**
 根据字符串生成二维码
 
 @param string  普通字符串或URL字符串
 @param size    二维码图片大小
 @return        生成的二维码图片
 */
+ (UIImage *)createQRCodeImageWithString:(NSString *)string imageSize:(CGSize)size {
    //实例化滤镜,这里的@"CIQRCodeGenerator"是固定的
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    //恢复滤镜的默认属性(因为滤镜可能保存上一次的属性)
    [filter setDefaults];
    //将字符串转换为NSData
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    //通过KVO设置滤镜inputMessage数据
    [filter setValue:data forKey:@"inputMessage"];
    
    //获取滤镜图像(此时获取到的图像比较模糊)
    CIImage *outputImage = [filter outputImage];
    
    //返回高清二维码图片
    return [self createHDQRCodeImageWithCIImage:outputImage size:size];
}

/**
 根据滤镜图像创建高清二维码图片

 @param cImage  滤镜图像
 @param size    二维码图片大小
 @return        生成的高清二维码图片
 */
+ (UIImage *)createHDQRCodeImageWithCIImage:(CIImage *)cImage size:(CGSize)size {
    CGRect extentRect = CGRectIntegral(cImage.extent);
    CGFloat scale = [UIScreen mainScreen].scale;
    
    size_t width = CGRectGetWidth(extentRect) * scale;
    size_t height = CGRectGetHeight(extentRect) * scale;
    
    //创建bitmap
    CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
    CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef bitmapImage = [context createCGImage:cImage fromRect:extentRect];
    CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
    CGContextScaleCTM(bitmapRef, scale, scale);
    CGContextDrawImage(bitmapRef, extentRect, bitmapImage);
    
    //保存bitmap图片
    CGImageRef scaleImage = CGBitmapContextCreateImage(bitmapRef);
    CGContextRelease(bitmapRef);
    CGImageRelease(bitmapImage);
    
    return [UIImage imageWithCGImage:scaleImage];
}
  • 调用示例:
//    NSString *testString = @"生成二维码";
    NSString *testString = @"https://github.com/WSongLin";
    
    self.imageView.image = [UIImage createQRCodeImageWithString:testString imageSize:CGSizeMake(180.f, 180.f)];

相关文章

网友评论

      本文标题:iOS 生成二维码

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