以前對iOS關(guān)于二維碼方面的知識(shí)掌握的比較零碎, 直到自己的一個(gè)關(guān)于支付方面iOS項(xiàng)目中有二維碼掃描界面、二維碼生成和二維碼解析的需求時(shí),我才比較系統(tǒng)的總結(jié)了一下,并且和大家分享,希望可以幫助更多的開發(fā)者。
二維碼圖片生成
推薦理由:
1,二維碼圖片可污損的范圍較大,不影響掃描。
2,可生成 黑白的、彩色的、中間有l(wèi)ogo的等各種樣式的二維碼圖片,并且可指定生成二維碼圖片的尺寸(無損縮放),中間logo的尺寸(建議:不要超過30%,否則影響掃描)。
3,功能豐富,可判斷相機(jī)是否授權(quán),圖冊是否授權(quán)等
需要詳細(xì)代碼,可去github下載,或者使用cocoapods ?[pod ?'ZXGQRCode'],??只是簡略代碼。
生成二維碼圖片關(guān)鍵類是CIFilter(來自CoreImage Framework),生成方法也非常簡單。
//生成黑白的二維碼圖片CIImage
+ (CIImage *)generateQRCodeImageWithString:(NSString *)str {
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
[filter setDefaults];
// 通過kvc方式給屬性賦值
[filter setValue:[str dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
[filter setValue:@"H" forKey:@"inputCorrectionLevel"];//設(shè)置二維碼的糾錯(cuò)水平,糾錯(cuò)水平越高,可以污損的范圍越大,值可設(shè)置為L(Low) |? M(Medium) | Q | H(High)
return [filter outputImage];
}
CIFilter對象生成的二維碼圖片屬于CIImage,可以通過[UIImage imageWithCIImage:]方法轉(zhuǎn)換為UIImage圖片。 ?也可以通過下面這個(gè)方法轉(zhuǎn)換為指定大小的UIImage。
//根據(jù)黑白的CIImage生成指定大小的UIImage
+ (UIImage *)generateUIImageFormCIImage:(CIImage *)image imageSize:(CGSize)imageSize {
CGRect extent = CGRectIntegral(image.extent);
CGFloat scale = MIN(imageSize.width / CGRectGetWidth(extent), imageSize.height / CGRectGetHeight(extent));
// 1.創(chuàng)建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);
// 3.生成原圖
return [UIImage imageWithCGImage:scaledImage];
}
如果需要在二維碼圖片中間加上logo圖片的話,可以使用下面這個(gè)方法。
//給UIImage中間添加水印圖片 注意尺寸不要太大(最大不超過二維碼圖片的%30),太大會(huì)造成掃不出來
+ (UIImage *)generateLogoImageWithImage:(UIImage *)originImage
imageSize:(CGSize)imageSize
logoImageName:(NSString *)logoImageName
logoImageSize:(CGSize)logoImageSize {
if (CGSizeEqualToSize(logoImageSize, CGSizeZero) || logoImageName == nil || [logoImageName isEqualToString:@""]) return originImage;
UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
[originImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
[[UIImage imageNamed:logoImageName] drawInRect:CGRectMake((imageSize.width - logoImageSize.width) / 2.0, (imageSize.height - logoImageSize.height) / 2.0, logoImageSize.width, logoImageSize.height)];
UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newPic;
}
項(xiàng)目中如果需要顏色更加豐富的二維碼圖片,可以通過下面方法指定顏色。
//生成彩色的CIImage
+ (CIImage *)generateColoursImageWithString:(NSString *)string
rgbColor:(UIColor *)rgbColor
backgroundColor:(UIColor *)backgroundColor {
//一:生成黑白的二維碼圖片
CIImage *ciImage = [self generateQRCodeImageWithString:string];
//二:給黑白的二維碼圖片渲染指定的顏色
CIFilter *filter = [CIFilter filterWithName:@"CIFalseColor"];// 創(chuàng)建顏色濾鏡
[filter setDefaults];
// 通過kvc方式給屬性賦值
[filter setValue:ciImage forKey:@"inputImage"];
[filter setValue:[CIColor colorWithCGColor:rgbColor.CGColor] forKey:@"inputColor0"];// 顏色
[filter setValue:[CIColor colorWithCGColor:backgroundColor.CGColor] forKey:@"inputColor1"];// 背景顏色
return [filter outputImage];
}
二維碼圖片解析
推薦理由:
1,解析精準(zhǔn)度很高。
需要詳細(xì)代碼,可去github下載,或者使用cocoapods? [pod? 'ZXGQRCode'],??只是簡略代碼。
二維碼圖片解析核心類是CIDetector(來自CoreImage Framework),使用方法也非常簡單。
//解析二維碼圖片
+ (NSString *)parseQRCodeImage:(UIImage *)qrCodeImage {
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy : CIDetectorAccuracyHigh}];//CIDetectorAccuracy指定檢測精度,CIDetectorAccuracyHigh | CIDetectorAccuracyLow
NSArray *features = [detector featuresInImage:qrCodeImage.CIImage];
if (features == nil || features.count <= 0) return @"";
CIQRCodeFeature *feature = [features firstObject];
return feature.messageString;
}
二維碼掃描界面
推薦理由:
1,整個(gè)掃描界面是用Quartz2D是繪制而成,頁面精美,細(xì)致。
2,掃描線條使用CADisplayLink定時(shí),順滑流暢不卡頓。
3,有效掃碼范圍,限定在掃碼框之內(nèi),使用體驗(yàn)更好。
4,支持二維碼、條形碼等多種掃描。
具體代碼比較多,在這里不好描述,有興趣的話,可去github下載,或者使用cocoapods? [pod? 'ZXGQRCode']。
小結(jié)
本文的二維碼知識(shí)在一般的iOS項(xiàng)目中,基本可以滿足使用。如果想進(jìn)一步了解二維碼原理的話,可以查看這篇二維碼的生成細(xì)節(jié)和原理。您的星星是對我最大的肯定。