系統(tǒng)的二維碼掃描 - 基礎(chǔ)實(shí)現(xiàn)

基礎(chǔ)功能偷厦,具體細(xì)節(jié)處理,需要再添加;

授權(quán)

二維碼掃描需要拍照功能,

    AVAuthorizationStatus authorizationStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    switch (authorizationStatus) {
        case AVAuthorizationStatusNotDetermined: {
            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler: ^(BOOL granted) {
                if (granted) {
                    [self startCapture];
                } else {
                    NSLog(@"%@", @"訪(fǎng)問(wèn)受限");
                }
            }];
            break;
        }
        case AVAuthorizationStatusAuthorized: {
            [self startCapture];
            break;
        }
        case AVAuthorizationStatusRestricted:
        case AVAuthorizationStatusDenied: {
            NSLog(@"%@", @"訪(fǎng)問(wèn)受限");
            break;
        }
        default: {
            break;
        }
    }

開(kāi)啟拍照掃描

- (void)startCapture {
    dispatch_async(dispatch_get_main_queue(), ^{
        AVCaptureSession *session = [[AVCaptureSession alloc] init];
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        NSError *error;
        AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
        if (deviceInput) {
            [session addInput:deviceInput];
            
            AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init];
            [metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
            [session addOutput:metadataOutput]; // 這行代碼要在設(shè)置 metadataObjectTypes 前
            metadataOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];
            
            AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
            previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
            previewLayer.frame = self.view.frame;
            [self.view.layer insertSublayer:previewLayer atIndex:0];
            
            
            CGRect rect = CGRectMake(CZScanLeftAndRightPadding, CZScanTopPadding, CGRectGetWidth([UIScreen mainScreen].bounds) - 2 * CZScanLeftAndRightPadding, CGRectGetWidth([UIScreen mainScreen].bounds) - 2 * CZScanLeftAndRightPadding);
            
            [[NSNotificationCenter defaultCenter] addObserverForName:AVCaptureInputPortFormatDescriptionDidChangeNotification
                                                              object:nil
                                                               queue:[NSOperationQueue currentQueue]
                                                          usingBlock: ^(NSNotification *_Nonnull note) {
                                                              
                                                              metadataOutput.rectOfInterest = [previewLayer metadataOutputRectOfInterestForRect:rect]; // 如果不設(shè)置错负,整個(gè)屏幕都可以?huà)?                                                          }];
            
            QRScanView *scanView = [[QRScanView alloc] initWithScanRect:rect];
            [self.view addSubview:scanView];
            
            [session startRunning];
            self.messageLabel.hidden = YES;
        } else {
            NSLog(@"%@", error);
        }
    });
}

掃描成果

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
    AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject;
    if ([metadataObject.type isEqualToString:AVMetadataObjectTypeQRCode]) { // 成功后系統(tǒng)不會(huì)停止掃描,可以用一個(gè)變量來(lái)控制勇边。
        if (self.scanComplete) {
            self.scanComplete(metadataObject.stringValue);
        }
        
        NSLog(@"提示掃描成功沒(méi)犹撒,1秒后返回,不然刷就回去了");
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self.navigationController popViewControllerAnimated:YES];
        });
    }
}

iOS8 識(shí)別圖中二維碼

給 image 加個(gè) 類(lèi)別就可以用了

- (NSString *)scanQRCodeFromImage {
    
    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{ CIDetectorAccuracy:CIDetectorAccuracyHigh }];
    CIImage *image = [[CIImage alloc] initWithImage:self];
    NSArray *features = [detector featuresInImage:image];
    CIQRCodeFeature *feature = [features firstObject];
    
    if (feature) {
        return feature.messageString;
    } else {
        return @"沒(méi)有二維碼";
    }
}

生成二維碼

同樣 拓展類(lèi)就行了粒褒,可能生成的圖片比較糊识颊,那么就放大倍數(shù)大一點(diǎn)就好了;

+ (UIImage *)createQRImageWithContent:(NSString *)content scale:(CGFloat)scale {
    
    NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding]; // NSISOLatin1StringEncoding 編碼

    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    [filter setValue:data forKey:@"inputMessage"];
    [filter setValue:@"M" forKey:@"inputCorrectionLevel"];// L: 7% M: 15% Q: 25% H: 30%
    
    CIImage *outputImage = filter.outputImage;

    CGAffineTransform transform = CGAffineTransformMakeScale(scale, scale); // scale 為放大倍數(shù)
    CIImage *transformImage = [outputImage imageByApplyingTransform:transform];

    // 保存
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef imageRef = [context createCGImage:transformImage fromRect:transformImage.extent];
    UIImage *qrCodeImage = [UIImage imageWithCGImage:imageRef];
    
    CGImageRelease(imageRef);
    
    return qrCodeImage;
}

https://github.com/JuYiWei/CZ_Demos
1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奕坟,一起剝皮案震驚了整個(gè)濱河市谊囚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌执赡,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件函筋,死亡現(xiàn)場(chǎng)離奇詭異沙合,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)跌帐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)首懈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谨敛,你說(shuō)我怎么就攤上這事究履。” “怎么了脸狸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵最仑,是天一觀的道長(zhǎng)藐俺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)泥彤,這世上最難降的妖魔是什么欲芹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮吟吝,結(jié)果婚禮上菱父,老公的妹妹穿的比我還像新娘。我一直安慰自己剑逃,他們只是感情好浙宜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蛹磺,像睡著了一般粟瞬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上称开,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天亩钟,我揣著相機(jī)與錄音,去河邊找鬼鳖轰。 笑死清酥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕴侣。 我是一名探鬼主播焰轻,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昆雀!你這毒婦竟也來(lái)了辱志?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狞膘,失蹤者是張志新(化名)和其女友劉穎揩懒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挽封,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡已球,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辅愿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片智亮。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖点待,靈堂內(nèi)的尸體忽然破棺而出阔蛉,到底是詐尸還是另有隱情,我是刑警寧澤癞埠,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布状原,位于F島的核電站聋呢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遭笋。R本人自食惡果不足惜坝冕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓦呼。 院中可真熱鬧喂窟,春花似錦、人聲如沸央串。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)质和。三九已至稳摄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饲宿,已是汗流浹背厦酬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘫想,地道東北人仗阅。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像国夜,于是被迫代替她去往敵國(guó)和親减噪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)车吹、插件筹裕、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 看起來(lái)像榴蓮的葉子
    小小鳥(niǎo)028閱讀 151評(píng)論 0 1
  • 忘記在哪看見(jiàn)過(guò)這樣一句話(huà),寫(xiě)的是如果你感到想不開(kāi)不妨就聽(tīng)聽(tīng)鳳凰傳奇的歌吧窄驹!聽(tīng)過(guò)確實(shí)都是正能量的詞朝卒,使人心胸開(kāi)闊的音...
    白云裊裊閱讀 333評(píng)論 0 0
  • 制作 .framework 靜態(tài)庫(kù)的步驟: 4、把 Podfile 中所有庫(kù)注釋掉然后 pod install乐埠,然...
    卡丁車(chē)手閱讀 2,475評(píng)論 0 1
  • 昨天中午剛午休完扎运,在站立著試圖讓自己從睡眼朦朧的狀況中清醒過(guò)來(lái)時(shí),飄來(lái)同事的聲音饮戳,“燕,班主任跟我說(shuō)洞拨,三...
    樂(lè)樂(lè)燕子閱讀 1,308評(píng)論 0 3