iOS 原生二維碼的生成和掃描

因為現(xiàn)在二維碼隨處可見,無論是實物商品還是各種禮券都少不了二維碼的身影宇姚。所以我們開發(fā)的時候有時候也需要用到二維碼的掃描,或者生成夫凸。今天就二維碼我們做一個簡單的實驗浑劳。

一、二維碼的生成
從 iOS 7 開始集成了二維碼的生成和讀取功能夭拌,所以這方法也僅支持 iOS 7.0 以上魔熏。

1、首先導入 CoreImage 框架


導入 CoreImage 框架

2鸽扁、通過濾鏡 CIFilter 生成二維碼


生成二維碼

完成之后運行工程蒜绽,我們發(fā)現(xiàn)這樣顯示的圖片不是很清晰,可以自己重繪圖片桶现,重新獲得高清的二維碼圖片躲雅。


重新獲得高清的二維碼圖片

這是實現(xiàn)方法,會返回一個 UIImage 的對象:


實現(xiàn)方法

OK骡和,現(xiàn)在可以看一下這兩種方法生成的二維碼相赁,做一個對比:


效果

打開我們們自己的手機,掃描一下這個生成的二維碼慰于,會發(fā)現(xiàn)我們放在 inputMessage 里面的那句話就顯示在手機上面了钮科,那如果是網址的話,改一下 inputMessage 的內容就可以了婆赠,這樣掃描完會直接打開所對應的網址:


打開對應的網址

附上上面的完整代碼:

// 1.創(chuàng)建過濾器
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    
    // 2.恢復濾鏡的默認屬性
    [filter setDefaults];
    
    
    // 3.給過濾器添加數據
    NSString *dataString = @"這是一個二維碼的生成結果";
    
    NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
    
    [filter setValue:data forKey:@"inputMessage"];
    
    // 4.獲取輸出的二維碼
    CIImage *outputImage = [filter outputImage];
    
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 175, 175)];
    
    // 5.顯示二維碼
    imageView.image = [UIImage imageWithCIImage:outputImage];
    
    [self.view addSubview:imageView];


// 因為生成的二維碼模糊,重新獲得高清的二維碼圖片
    UIImageView *newImageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 300, 175, 175)];
    
    newImageView.image = [self createNonInterpolatedUIImageFormCIImage:outputImage withSize:175];
    
    [self.view addSubview:newImageView];

實現(xiàn)方法:

/**
 *  根據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];
}

二绵脯、二維碼的掃描
1、注意:
二維碼掃碼需要使用攝像頭,需要真機設備桨嫁,模擬器不行植兰。

2、二維碼掃描的過程
通過攝像頭掃描二維碼
解析二維碼數據
根據二維碼信息執(zhí)行相應的操作

還是同樣的璃吧,先導入所需要的頭文件楣导,遵循代理協(xié)議,聲明所需要的屬性:


先導入所需要的頭文件畜挨,遵循代理協(xié)議筒繁,聲明所需要的屬性

接著就是實現(xiàn),可以寫在button的點擊方法里面:


實現(xiàn)代碼

當掃描到結果后會調用的代理方法:


代理方法

OK巴元,現(xiàn)在先找一個二維碼毡咏,然后運行工程,掃描剛剛找的這個二維碼逮刨,看一下打印結果:


打印結果

同樣附上掃描的全部代碼:

// 1.創(chuàng)建捕捉會話
    self.session = [[AVCaptureSession alloc] init];
    
    // 2.添加輸入設備(數據從攝像頭輸入)
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
    [self.session addInput:input];
    
    // 3.添加輸出數據
    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    [self.session addOutput:output];
    
    // 3.1.設置輸入元數據的類型(類型是二維碼數據)
    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
    
    // 4.添加掃描圖層
    self.layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    self.layer.frame = self.view.bounds;
    [self.view.layer addSublayer:self.layer];
    
    // 5.開始掃描
    [self.session startRunning];

代理方法:

// 當掃描到數據時就會執(zhí)行該代理方法,會頻繁的掃描呕缭,調用代理方法
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    if (metadataObjects.count > 0) {
        //獲得掃描數據,最后一個時最新掃描的數據
        AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
        NSLog(@"%@", object.stringValue);
        
        // 停止掃描
        [self.session stopRunning];
        
        // 將預覽圖層移除
        [self.layer removeFromSuperlayer];
    } else {
        NSLog(@"沒有掃描到數據");
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末修己,一起剝皮案震驚了整個濱河市恢总,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睬愤,老刑警劉巖片仿,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尤辱,居然都是意外死亡砂豌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門光督,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阳距,“玉大人,你說我怎么就攤上這事可帽÷ι” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵映跟,是天一觀的道長蓄拣。 經常有香客問我,道長努隙,這世上最難降的妖魔是什么球恤? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮荸镊,結果婚禮上咽斧,老公的妹妹穿的比我還像新娘堪置。我一直安慰自己,他們只是感情好张惹,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布舀锨。 她就那樣靜靜地躺著,像睡著了一般宛逗。 火紅的嫁衣襯著肌膚如雪坎匿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天雷激,我揣著相機與錄音替蔬,去河邊找鬼。 笑死屎暇,一個胖子當著我的面吹牛承桥,可吹牛的內容都是我干的。 我是一名探鬼主播根悼,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凶异,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挤巡?” 一聲冷哼從身側響起唠帝,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玄柏,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體贴铜,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡粪摘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绍坝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徘意。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖轩褐,靈堂內的尸體忽然破棺而出椎咧,到底是詐尸還是另有隱情,我是刑警寧澤把介,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布勤讽,位于F島的核電站,受9級特大地震影響拗踢,放射性物質發(fā)生泄漏脚牍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一巢墅、第九天 我趴在偏房一處隱蔽的房頂上張望诸狭。 院中可真熱鬧券膀,春花似錦、人聲如沸驯遇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叉庐。三九已至舒帮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間眨唬,已是汗流浹背会前。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匾竿,地道東北人瓦宜。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像岭妖,于是被迫代替她去往敵國和親临庇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容