• iOS开发之生成二维码


    一、二维码的生成

    从iOS7开始集成了二维码的生成和读取功能 
    此前被广泛使用的zbarsdk目前不支持64位处理器

     

    1.二维码的内容(传统的条形码只能放数字)

    • 纯文本
    • 名片
    • URL
     

    2.生成二维码的步骤:

    1. 导入CoreImage框架(Xcode6.4居然不用导入)
    2. 通过滤镜CIFilter生成二维码
    1. // 1.创建过滤器
    2. CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    3. // 2.恢复默认
    4. [filter setDefaults];
    5. // 3.给过滤器添加数据
    6. NSString *dataString = @"http://www.520it.com";
    7. NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
    8. // 4.通过KVO设置滤镜inputMessage数据
    9. [filter setValue:data forKeyPath:@"inputMessage"];
    10. // 4.获取输出的二维码
    11. CIImage *outputImage = [filter outputImage];
    12. // 5.将CIImage转换成UIImage,并放大显示
    13. self.imageView.image = [UIImage imageWithCIImage:outputImage scale:20.0 orientation:UIImageOrientationUp];

    此处输入图片的描述 

    默认情况下生成的图片比较模糊,所以要通过网上的代码重绘一下,但是网上的代码也看不懂

    1. - (void)viewDidLoad {
    2. [super viewDidLoad];
    3. // 1.创建过滤器
    4. CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    5. // 2.恢复默认
    6. [filter setDefaults];
    7. // 3.给过滤器添加数据(正则表达式/账号和密码)
    8. NSString *dataString = @"http://www.520it.com";
    9. NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
    10. [filter setValue:data forKeyPath:@"inputMessage"];
    11. // 4.获取输出的二维码
    12. CIImage *outputImage = [filter outputImage];
    13. // 5.将CIImage转换成UIImage,并放大显示
    14. self.imageView.image = [self createNonInterpolatedUIImageFormCIImage:outputImage withSize:200];
    15. }
    16. /**
    17. * 根据CIImage生成指定大小的UIImage
    18. *
    19. * @param image CIImage
    20. * @param size 图片宽度
    21. */
    22. - (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size
    23. {
    24. CGRect extent = CGRectIntegral(image.extent);
    25. CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
    26. // 1.创建bitmap;
    27. size_t width = CGRectGetWidth(extent) * scale;
    28. size_t height = CGRectGetHeight(extent) * scale;
    29. CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
    30. CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
    31. CIContext *context = [CIContext contextWithOptions:nil];
    32. CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
    33. CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
    34. CGContextScaleCTM(bitmapRef, scale, scale);
    35. CGContextDrawImage(bitmapRef, extent, bitmapImage);
    36. // 2.保存bitmap到图片
    37. CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
    38. CGContextRelease(bitmapRef);
    39. CGImageRelease(bitmapImage);
    40. return [UIImage imageWithCGImage:scaledImage];
    41. }

    此处输入图片的描述

     

    二、二维码的容错

    二维码都有一定的纠错,就是有部分污损或者破损都没有关系,照常识别。但是也是有限度的 
    这根据生成时使用的纠错级别而定,可以有7%~%30左右的损坏(大致),实际上保守一点更好。

    基本原则: 
    1、三个角上的“回”及“回”字周围的底色不要动 
    2、中间部分和不带“回”字的一角是可以填图片的(中间最好) 
    3、如果中间有小的“回”字,能不变就不变,能少变就少变 
    4、尽可能放大二维码后再添加图片,不要添加图片后放大 
    5、生成时尽量选择较高的纠错级别

    在生成二维码后可以在中间加上图片仍可识别。 
    此处输入图片的描述

  • 相关阅读:
    ArcGIS SilverLight/WPF API 2.0版本已正式发布,新特性
    ArcGIS Server Flex API 自定义缩放控件的级数[代码]
    First
    HTML和JavaScript代码分离、平稳退化(1)
    cocos2dx 仿射变换
    java数组创建
    第一次看CCControl
    从零开始のcocos2dx生活(四)ActionManager
    从零开始のcocos2dx生活(二)Node
    从零开始のcocos2dx生活(三)Scheduler
  • 原文地址:https://www.cnblogs.com/davidyff/p/5254578.html
Copyright © 2020-2023  润新知