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、生成時盡量選擇較高的糾錯級別

在生成二維碼后可以在中間加上圖片仍可識別。 
此處輸入圖片的描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM