iOS開發 - 二維碼的產生與讀取

來源:互聯網
上載者:User

標籤:atomic   connect   輸出   www   預覽   tor   設定   input   數字   

二維碼的產生

從iOS7開始整合了二維碼的產生和讀取功能
此前被廣泛使用的zbarsdk眼下不支援64位處理器

產生二維碼的步驟:
匯入CoreImage架構
通過濾鏡CIFilter產生二維碼

二維碼的內容(傳統的條碼僅僅能放數字):

純文字名片URL
產生二維碼
// 1. 執行個體化二維碼濾鏡CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];// 2. 恢複濾鏡的預設屬性[filter setDefaults];// 3. 將字串轉換成NSDataNSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];// 4. 通過KVO設定濾鏡inputMessage資料[filter setValue:data forKey:@"inputMessage"];// 5. 獲得濾鏡輸出的映像CIImage *outputImage = [filter outputImage];// 6. 將CIImage轉換成UIImage。並放大顯示return [UIImage imageWithCIImage:outputImage scale:20.0 orientation:UIImageOrientationUp];
讀取二維碼

讀取二維碼須要匯入AVFoundation架構
利用網路攝影機識別二維碼中的內容(模擬器不行)

輸入(網路攝影機)
由會話將網路攝影機採集到的二維碼映像轉換成字串資料
輸出(資料)
由預覽圖層顯示掃描情境

設定拍攝會話
// 1. 執行個體化拍攝裝置AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];// 2. 設定輸入裝置AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];// 3. 設定中繼資料輸出// 3.1 執行個體化拍攝中繼資料輸出AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];// 3.3 設定輸出資料代理[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];// 4. 加入拍攝會話// 4.1 執行個體化拍攝會話AVCaptureSession *session = [[AVCaptureSession alloc] init];// 4.2 加入會話輸入[session addInput:input];// 4.3 加入會話輸出[session addOutput:output];// 4.3 設定輸出資料類型,須要將中繼資料輸出加入到會話後,才幹指定中繼資料類型,否則會報錯[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
設定拍攝視頻預覽圖層
// 5. 視頻預覽圖層// 5.1 執行個體化預覽圖層AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];preview.videoGravity = AVLayerVideoGravityResizeAspectFill;preview.frame = self.view.bounds;// 5.2 將圖層插入當前視圖[self.view.layer insertSublayer:preview atIndex:100];self.previewLayer = preview;// 6. 啟動會話[_session startRunning];
產生百度二維碼執行個體
#import <CoreImage/CoreImage.h>@interface ViewController ()@property (weak, nonatomic) IBOutlet UIImageView *iv;@end@implementation ViewController- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{    // 1.執行個體化二維碼濾鏡    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];    // 2.恢複濾鏡的預設屬性 (由於濾鏡有可能儲存上一次的屬性)    [filter setDefaults];    // 3.將字串轉換成NSdata    NSData *data  = [@"http://www.baidu.com" dataUsingEncoding:NSUTF8StringEncoding];    // 4.通過KVO設定濾鏡, 傳入data, 將來濾鏡就知道要通過傳入的資料產生二維碼    [filter setValue:data forKey:@"inputMessage"];    // 5.產生二維碼     CIImage *outputImage = [filter outputImage];    UIImage *image = [UIImage  imageWithCIImage:outputImage];    // 6.設定產生好得二維碼到imageview上    self.iv.image = image;}@end

執行個體圖

讀取百度二維碼執行個體
#import <AVFoundation/AVFoundation.h>@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>@property (nonatomic, strong) AVCaptureSession *session;@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // 1. 執行個體化拍攝裝置    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];    // 2. 設定輸入裝置    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];    // 3. 設定中繼資料輸出    // 3.1 執行個體化拍攝中繼資料輸出    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];    // 3.3 設定輸出資料代理    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];    // 4. 加入拍攝會話    // 4.1 執行個體化拍攝會話    AVCaptureSession *session = [[AVCaptureSession alloc] init];    // 4.2 加入會話輸入    [session addInput:input];    // 4.3 加入會話輸出    [session addOutput:output];    // 4.3 設定輸出資料類型,須要將中繼資料輸出加入到會話後。才幹指定中繼資料類型。否則會報錯    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];    self.session = session;    // 5. 視頻預覽圖層    // 5.1 執行個體化預覽圖層, 傳遞_session是為了告訴圖層將來顯示什麼內容    AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];    preview.videoGravity = AVLayerVideoGravityResizeAspectFill;    preview.frame = self.view.bounds;    // 5.2 將圖層插入當前視圖    [self.view.layer insertSublayer:preview atIndex:100];    self.previewLayer = preview;    // 6. 啟動會話    [_session startRunning];}- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{    // 會頻繁的掃描,調用代理方法    // 1. 假設掃描完畢。停止會話    [self.session stopRunning];    // 2. 刪除預覽圖層    [self.previewLayer removeFromSuperlayer];    NSLog(@"%@", metadataObjects);    // 3. 設定介面顯示掃描結果    if (metadataObjects.count > 0) {        AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];        // 提示:假設須要對url或者名片等資訊進行掃描,能夠在此進行擴充。        NSLog(@"%@", obj.stringValue);    }}@end

iOS開發 - 二維碼的產生與讀取

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.