iOS二維碼的生成和掃碼詳細(xì)介紹(手把手教)

  • 二維碼是用特定的幾何圖形來記錄信息
  • 在之前,常用的二維碼開發(fā)框架有:ZXingZBarSDK
  • 蘋果從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ì)二維碼的改善:效果如下

帶logo的二維碼

你需要做的是:(已經(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來加載的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末潮改,一起剝皮案震驚了整個(gè)濱河市向拆,隨后出現(xiàn)的幾起案子烤咧,更是在濱河造成了極大的恐慌,老刑警劉巖抢呆,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煮嫌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抱虐,警方通過查閱死者的電腦和手機(jī)昌阿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恳邀,“玉大人懦冰,你說我怎么就攤上這事∫シ校” “怎么了刷钢?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鳄抒。 經(jīng)常有香客問我闯捎,道長(zhǎng),這世上最難降的妖魔是什么许溅? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任瓤鼻,我火速辦了婚禮,結(jié)果婚禮上贤重,老公的妹妹穿的比我還像新娘茬祷。我一直安慰自己,他們只是感情好并蝗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布祭犯。 她就那樣靜靜地躺著,像睡著了一般滚停。 火紅的嫁衣襯著肌膚如雪沃粗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天键畴,我揣著相機(jī)與錄音最盅,去河邊找鬼。 笑死起惕,一個(gè)胖子當(dāng)著我的面吹牛涡贱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惹想,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼问词,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嘀粱?” 一聲冷哼從身側(cè)響起激挪,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤辰狡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后灌灾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搓译,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悲柱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年锋喜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豌鸡。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘿般,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涯冠,到底是詐尸還是另有隱情炉奴,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布蛇更,位于F島的核電站瞻赶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏派任。R本人自食惡果不足惜砸逊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掌逛。 院中可真熱鬧师逸,春花似錦、人聲如沸豆混。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皿伺。三九已至员辩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸵鸥,已是汗流浹背奠滑。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脂男,地道東北人养叛。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宰翅,于是被迫代替她去往敵國(guó)和親弃甥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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