- 二維碼是用特定的幾何圖形來記錄信息
- 在之前,常用的二維碼開發(fā)框架有:
ZXing
和ZBarSDK
- 蘋果從
iOS7
開始集成了二維碼的生成和讀取功能,并且之前的框架不支持64
位,因此目前只是用蘋果的框架即可
二.二維碼的生成
- 二維碼的生成就是將固定的信息生成對(duì)應(yīng)的二維碼
- 生成二維碼的步驟:
(1).導(dǎo)入CoreImage框架
(2).通過濾鏡CIFilter生成二維碼
<1>.創(chuàng)建濾鏡對(duì)象
<2>.設(shè)置濾鏡的默認(rèn)設(shè)置
<3>.給濾鏡設(shè)置數(shù)據(jù)(KVC)
<4>.獲取生成的二維碼圖形
下面是實(shí)際代碼:
1.導(dǎo)入#import <CoreImage/CoreImage.h> :此框架非常強(qiáng)大
-
2.創(chuàng)建CIFilte(濾鏡)對(duì)象
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
-
3.恢復(fù)濾鏡默認(rèn)設(shè)置
[filter setDefaults];
-
4.設(shè)置數(shù)據(jù)(通過濾鏡對(duì)象的
KVC
)//存放的信息 NSString *info = @"我叫王沖"; //把信息轉(zhuǎn)化為NSData NSData *infoData = [info dataUsingEncoding:NSUTF8StringEncoding]; //濾鏡對(duì)象kvc存值 [filter setValue:infoData forKeyPath:@"inputMessage"]; //我們可以打印,看過濾器的 輸入屬性.這樣我們才知道給誰賦值 NSLog(@"%@",qrImageFilter.inputKeys); /* inputMessage, //二維碼輸入信息 inputCorrectionLevel //二維碼錯(cuò)誤的等級(jí),就是容錯(cuò)率 */
-
5.生成二維碼(前提建立一個(gè)
UIIMageView
對(duì)象存放圖片),但是圖片 發(fā)現(xiàn)有的小 (27,27),我們需要放大CIImage *outImage = [filter outputImage];
(1).不處理的情況下生成的二維碼(其實(shí)生成的二維碼是小的,目前是被放大了)
imageView.image = [UIImage imageWithCIImage:outImage];//不處理圖片模糊,故而調(diào)用下面的信息
(2).處理過的圖片(需要調(diào)用一個(gè)方法來處理圖片)
imageView.image = [self createNonInterpolatedUIImageFormCIImage:outImage withSize:300];
/**
* 根據(jù)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.創(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);
return [UIImage imageWithCGImage:scaledImage];
}
生成的二維碼
iOS生成二維碼code 密碼: bt8f
iOS二維碼生成方法封裝過的code 密碼: 3vqj
重點(diǎn):在此我進(jìn)行了對(duì)二維碼的改善:效果如下
你需要做的是:(已經(jīng)封裝好了)
1.導(dǎo)入:SDWebImage 框架
2.拖入我封裝好的類 ,導(dǎo)入 #import "LogoQR.h"
3.創(chuàng)建UIImageView的對(duì)象來放二維碼
4.調(diào)用方法
/**
* [LogoQR new] 調(diào)用方法的對(duì)象
* QRurl :頭像的鏈接
* messages: 二維碼里面存放的信息
*/
UIImageView的對(duì)象.image = [[LogoQR new] QRurl:urlString
messages:self.messages];
帶logo的二維碼 密碼: q6s6
三.二維碼的掃描
- 二維碼掃描就是將二維碼的圖像讀取,并且解析成我們可以是別的信息
- 掃描二維碼的步驟
(1).讀取二維碼需要導(dǎo)入AVFoundation框架
(2).利用攝像頭讀取信息,并且輸入
<1>.獲取捕捉會(huì)話(AVFoundation框架)
<2>.設(shè)置輸入攝像頭
<3>.設(shè)置輸出數(shù)據(jù)
<4>.添加預(yù)覽圖層
<5>.開始掃描二維碼
1.導(dǎo)入框架 #import <AVFoundation/AVFoundation.h>
-
2.獲取捕捉會(huì)話
AVCaptureSession *session = [[AVCaptureSession alloc]init]; self.session = session;
-
3.設(shè)置輸入(攝像頭)
//AVMediaTypeVideo:攝像頭, AVMediaTypeAudio:話筒, AVMediaTypeMuxed:彈幕 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if (error) { //防止模擬器崩潰 NSLog(@"沒有攝像頭設(shè)備"); return; } AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; [session addInput:input];
-
4.設(shè)置輸出(數(shù)據(jù)) 掛代理
<AVCaptureMetadataOutputObjectsDelegate> 掛代理 AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc]init]; [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; [session addOutput:output]; //設(shè)置輸出類型,必須在output 加入到會(huì)話之后來設(shè)置 [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
-
5.添加預(yù)覽層
AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session]; layer.frame = self.view.bounds; [self.view.layer addSublayer:layer]; self.layer = layer;
-
6.開始掃描
[session startRunning];
7.調(diào)用掃面結(jié)果的代理方法
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if (metadataObjects.count>0)
{
//1.獲取到掃描的內(nèi)容
AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
NSLog(@"掃描的內(nèi)容==%@",object.stringValue);
//2.停止會(huì)話
[self.session stopRunning];
//3.移除預(yù)覽圖層
[self.layer removeFromSuperlayer];
}
}
比較好的二維碼掃描
也挺詳細(xì)的;
說明:掃描的內(nèi)容是什么是可以打印出來的,如果是鏈接,你可以用WebView來加載的