iOS 二維碼基礎(chǔ)

以前對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é)和原理。您的星星是對我最大的肯定。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • //圖片水印效果 -(UIImage*)OriginImage:(UIImage *)image scaleToS...
    貪吃的貓cx閱讀 1,188評論 0 4
  • //聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄 #import"SHCodeTableViewCe...
    石虎132閱讀 677評論 0 17
  • Core Image是一個(gè)強(qiáng)大的框架,它能夠讓你輕松地對圖像進(jìn)行過濾。你能夠通過修改圖像的飽和度、色調(diào)或曝光率來獲...
    木易林1閱讀 1,159評論 0 1
  • 一、掃描 1、 ZBar ZBar在掃描的靈敏度上,和內(nèi)存的使用上相對于ZXing上都是較優(yōu)的,但是對于 “圓角二...
    空白Null閱讀 1,090評論 0 2
  • 打w卡的人數(shù)基本穩(wěn)定下來,好多學(xué)員曬出了自己的筆記。我相信,曬筆記的肯定能堅(jiān)持下,剩余的16天。群中,年齡最大的1...
    石三英語閱讀 411評論 0 3