一、二維碼的生成
從iOS7開始集成了二維碼的生成和讀取功能
此前被廣泛使用的zbarsdk目前不支持64位處理器
1.二維碼的內容(傳統的條形碼只能放數字)
- 純文本
- 名片
- URL
2.生成二維碼的步驟:
- 導入CoreImage框架(Xcode6.4居然不用導入)
- 通過濾鏡CIFilter生成二維碼
// 1.創建過濾器
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 2.恢復默認
[filter setDefaults];
// 3.給過濾器添加數據
NSString *dataString = @"http://www.520it.com";
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
// 4.通過KVO設置濾鏡inputMessage數據
[filter setValue:data forKeyPath:@"inputMessage"];
// 4.獲取輸出的二維碼
CIImage *outputImage = [filter outputImage];
// 5.將CIImage轉換成UIImage,並放大顯示
self.imageView.image = [UIImage imageWithCIImage:outputImage scale:20.0 orientation:UIImageOrientationUp];
默認情況下生成的圖片比較模糊,所以要通過網上的代碼重繪一下,但是網上的代碼也看不懂
- (void)viewDidLoad {
[super viewDidLoad];
// 1.創建過濾器
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 2.恢復默認
[filter setDefaults];
// 3.給過濾器添加數據(正則表達式/賬號和密碼)
NSString *dataString = @"http://www.520it.com";
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKeyPath:@"inputMessage"];
// 4.獲取輸出的二維碼
CIImage *outputImage = [filter outputImage];
// 5.將CIImage轉換成UIImage,並放大顯示
self.imageView.image = [self createNonInterpolatedUIImageFormCIImage:outputImage withSize:200];
}
/**
* 根據CIImage生成指定大小的UIImage
*
* @param image CIImage
* @param size 圖片寬度
*/
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size
{
CGRect extent = CGRectIntegral(image.extent);
CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
// 1.創建bitmap;
size_t width = CGRectGetWidth(extent) * scale;
size_t height = CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (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);
// 2.保存bitmap到圖片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage imageWithCGImage:scaledImage];
}
二、二維碼的容錯
二維碼都有一定的糾錯,就是有部分污損或者破損都沒有關系,照常識別。但是也是有限度的
這根據生成時使用的糾錯級別而定,可以有7%~%30左右的損壞(大致),實際上保守一點更好。
基本原則:
1、三個角上的“回”及“回”字周圍的底色不要動
2、中間部分和不帶“回”字的一角是可以填圖片的(中間最好)
3、如果中間有小的“回”字,能不變就不變,能少變就少變
4、盡可能放大二維碼后再添加圖片,不要添加圖片后放大
5、生成時盡量選擇較高的糾錯級別
在生成二維碼后可以在中間加上圖片仍可識別。