iOS開發(fā)-二維碼的生成及讀取

利用AVFoundation框架比第三方框架識別二維碼更快速,并且第三方框架不支持64位,本篇文章使用AVFoundation框架來完成二維碼讀取

二維碼的讀取

1.創(chuàng)建一個捕捉會話

let session = AVCaptureSession()

2.設置輸入設備

let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
guard let deviceInput = try? AVCaptureDeviceInput(device: device) else {
            print("沒有獲取到輸入設備")
            return
        }
session.addInput(deviceInput)

3.設置輸出設備和代理

let output = AVCaptureMetadataOutput()
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
session.addOutput(output)
output.metadataObjectTypes = output.availableMetadataObjectTypes

4.設置掃描范圍為掃描框內,注意,設置范圍的x,y軸是于iOS的x,y軸相反的

let rect = UIScreen.mainScreen().bounds
// containerView是掃描框控件
let containerRect = containerView.frame
output.rectOfInterest = CGRect(x: containerRect.origin.y / rect.size.height , y: containerRect.origin.x / rect.size.width, width: containerRect.size.height / rect.size.height, height: containerRect.size.width / rect.size.width)

5.添加預覽圖層并開始掃描

let previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewLayer.frame = UIScreen.mainScreen().bounds
view.layer.insertSublayer(previewLayer, atIndex: 0)
self.previewLayer = previewLayer
       
session.startRunning()

6.在代理方法中獲得掃描的數據并設置將獲得的數據顯示出來

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!)

從相冊讀取二維碼

1.創(chuàng)建照片源

        if !UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary) {
            print("照片庫不可用")
            return
        }
        
        // 創(chuàng)建選擇照片的控制器
        let ipc = UIImagePickerController()
        
        // 設置照片源
        ipc.sourceType = .PhotoLibrary
        
        // 設置代理
        ipc.delegate = self
        
        // 彈出控制器
        presentViewController(ipc, animated: true, completion: nil)

2.在代理方法中拿到照片并讀取

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        // 拿到圖片
        guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else {
            print("沒有獲取到照片")
            return
        }

        // 創(chuàng)建掃描器
        let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: nil)
        
        // 掃描結果
        guard let ciImage = CIImage(image: image) else {
            print("轉ciImage失敗")
            return
        }

        let features = detector.featuresInImage(ciImage)

        // 遍歷掃描結果
        for f in features {
            guard let feature = f as? CIQRCodeFeature else {
                continue
            }
            
            print(feature.messageString)
        }

    }

生成二維碼,并且在二維碼中心畫上頭像

override func viewDidLoad() {
        super.viewDidLoad()
        
        // 創(chuàng)建濾鏡
        let filter = CIFilter(name: "CIQRCodeGenerator")
        
        // 恢復默認設置
        filter?.setDefaults()
        
        // 設置數據
        let qrcodeInfo = "http://www.reibang.com/users/d4396e83f3b4/latest_articles"
        guard let qrcodeInfoData = qrcodeInfo.dataUsingEncoding(NSUTF8StringEncoding) else {
            return
        }
        filter?.setValue(qrcodeInfoData, forKeyPath: "inputMessage")
        
        // 獲取生成的圖片
        guard let outputImage = filter?.outputImage else {
            return
        }
        
        // 設置圖片
        let image = scaleImage(outputImage)
        
        // 在二維碼中畫上頭像
        qrcodeView.image = drawIconView(image, iconName: "111")
    }
    
    private func drawIconView(image : UIImage, iconName : String) -> UIImage {
        // 開啟圖片上下文
        UIGraphicsBeginImageContext(image.size)
        
        // 將圖片畫到上下文中
        image.drawInRect(CGRect(origin: CGPointZero, size: image.size))
        
        // 根據圖標名稱生成圖片,并且將圖片畫到上下文中
        let iconImage = UIImage(named: iconName)
        let width : CGFloat = 60
        let height : CGFloat = 60
        let x = (image.size.width - width) * 0.5
        let y = (image.size.height - height) * 0.5
        iconImage?.drawInRect(CGRect(x: x, y: y, width: width, height: height))
        
        // 獲取圖片
        let drawImage = UIGraphicsGetImageFromCurrentImageContext()
        
        // 關閉上下文
        UIGraphicsEndImageContext()
        
        return drawImage
    }
    // 放大生成的二維碼
    private func scaleImage(ciImage : CIImage) -> UIImage {
        // 創(chuàng)建放大的系數
        let tranform = CGAffineTransformMakeScale(10, 10)
        
        // 根據放大系數放大的圖片
        let newImage = ciImage.imageByApplyingTransform(tranform)
        
        // 返回生成好的圖片
        return UIImage(CIImage: newImage)
    }

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末掠廓,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖不翩,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件书闸,死亡現場離奇詭異,居然都是意外死亡但骨,警方通過查閱死者的電腦和手機躲惰,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門致份,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人础拨,你說我怎么就攤上這事氮块∩茉兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵滔蝉,是天一觀的道長击儡。 經常有香客問我,道長蝠引,這世上最難降的妖魔是什么阳谍? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮螃概,結果婚禮上边坤,老公的妹妹穿的比我還像新娘。我一直安慰自己谅年,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布肮韧。 她就那樣靜靜地躺著融蹂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弄企。 梳的紋絲不亂的頭發(fā)上超燃,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音拘领,去河邊找鬼意乓。 笑死,一個胖子當著我的面吹牛约素,可吹牛的內容都是我干的届良。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼圣猎,長吁一口氣:“原來是場噩夢啊……” “哼士葫!你這毒婦竟也來了?” 一聲冷哼從身側響起送悔,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤慢显,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后欠啤,有當地人在樹林里發(fā)現了一具尸體荚藻,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年洁段,在試婚紗的時候發(fā)現自己被綠了应狱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡眉撵,死狀恐怖侦香,靈堂內的尸體忽然破棺而出落塑,到底是詐尸還是另有隱情,我是刑警寧澤罐韩,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布憾赁,位于F島的核電站,受9級特大地震影響散吵,放射性物質發(fā)生泄漏龙考。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一矾睦、第九天 我趴在偏房一處隱蔽的房頂上張望晦款。 院中可真熱鬧,春花似錦枚冗、人聲如沸缓溅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坛怪。三九已至,卻和暖如春股囊,著一層夾襖步出監(jiān)牢的瞬間袜匿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工稚疹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留居灯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓内狗,卻偏偏與公主長得像怪嫌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柳沙,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容