国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

ios swift3.0實(shí)現(xiàn)二維碼掃描、生成、識(shí)別示例代碼

2019-10-21 18:48:17
字體:
供稿:網(wǎng)友

基于swift3.0

1.掃描二維碼

swift3.0二維碼掃描,swift3,掃描二維碼,ios,swift,二維碼生成

設(shè)置掃描會(huì)話,圖層和輸入輸出

  //設(shè)置捕捉設(shè)備    let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)    do    {      //設(shè)置設(shè)備輸入輸出      let input = try AVCaptureDeviceInput(device: device)      let output = AVCaptureMetadataOutput()      output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)      //設(shè)置會(huì)話      let scanSession = AVCaptureSession()      scanSession.canSetSessionPreset(AVCaptureSessionPresetHigh)      if scanSession.canAddInput(input)      {        scanSession.addInput(input)      }      if scanSession.canAddOutput(output)      {        scanSession.addOutput(output)      }      //設(shè)置掃描類型(二維碼和條形碼)      output.metadataObjectTypes = [      AVMetadataObjectTypeQRCode,      AVMetadataObjectTypeCode39Code,      AVMetadataObjectTypeCode128Code,      AVMetadataObjectTypeCode39Mod43Code,      AVMetadataObjectTypeEAN13Code,      AVMetadataObjectTypeEAN8Code,      AVMetadataObjectTypeCode93Code]      //預(yù)覽圖層      let scanPreviewLayer = AVCaptureVideoPreviewLayer(session:scanSession)      scanPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill      scanPreviewLayer?.frame = view.layer.bounds      view.layer.insertSublayer(scanPreviewLayer!, at: 0)      //自動(dòng)對(duì)焦      if (device?.isFocusModeSupported(.autoFocus))!      {        do { try input.device.lockForConfiguration() } catch{ }        input.device.focusMode = .autoFocus        input.device.unlockForConfiguration()      }      //設(shè)置掃描區(qū)域      NotificationCenter.default.addObserver(forName: NSNotification.Name.AVCaptureInputPortFormatDescriptionDidChange, object: nil, queue: nil, using: {[weak self] (noti) in          output.rectOfInterest = (scanPreviewLayer?.metadataOutputRectOfInterest(for: self!.scanPane.frame))!      })      //保存會(huì)話      self.scanSession = scanSession    }    catch    {      //攝像頭不可用      Tool.confirm(title: "溫馨提示", message: "攝像頭不可用", controller: self)      return    }

開始掃描

    if !scanSession.isRunning    {      scanSession.startRunning()    }

掃描結(jié)果在代理方法中

//掃描捕捉完成extension ScanCodeViewController : AVCaptureMetadataOutputObjectsDelegate{  func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!)  {    //停止掃描    self.scanLine.layer.removeAllAnimations()    self.scanSession!.stopRunning()    //播放聲音    Tool.playAlertSound(sound: "noticeMusic.caf")    //掃完完成    if metadataObjects.count > 0    {      if let resultObj = metadataObjects.first as? AVMetadataMachineReadableCodeObject      {        Tool.confirm(title: "掃描結(jié)果", message: resultObj.stringValue, controller: self,handler: { (_) in          //繼續(xù)掃描          self.startScan()        })      }    }  }}

2.二維碼生成

swift3.0二維碼掃描,swift3,掃描二維碼,ios,swift,二維碼生成

通過濾鏡生成CGImage

    //2.二維碼濾鏡    let contentData = self.data(using: String.Encoding.utf8)    let fileter = CIFilter(name: "CIQRCodeGenerator")    fileter?.setValue(contentData, forKey: "inputMessage")    fileter?.setValue("H", forKey: "inputCorrectionLevel")    let ciImage = fileter?.outputImage    //3.顏色濾鏡    let colorFilter = CIFilter(name: "CIFalseColor")    colorFilter?.setValue(ciImage, forKey: "inputImage")    colorFilter?.setValue(CIColor(cgColor: QRCodeColor.cgColor), forKey: "inputColor0")// 二維碼顏色    colorFilter?.setValue(CIColor(cgColor: QRCodeBgColor.cgColor), forKey: "inputColor1")// 背景色    //4.生成處理    let outImage = colorFilter!.outputImage    let scale = QRCodeSize / outImage!.extent.size.width;    let transform = CGAffineTransform(scaleX: scale, y: scale)    let transformImage = colorFilter!.outputImage!.applying(transform)

通過CGImage生成UIImage

let image = UIImage(ciImage: ciImage)

繪制Logo和邊框

// 繪制logoUIGraphicsBeginImageContextWithOptions(image.size, false, UIScreen.main.scale)    image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))//線框let logoBorderLineImagae = QRCodeLogo.getRoundRectImage(size: logoWidth, radius: radius, borderWidth: borderLineWidth, borderColor: borderLineColor)//邊框let logoBorderImagae = logoBorderLineImagae.getRoundRectImage(size: logoWidth, radius: radius, borderWidth: boderWidth, borderColor: borderColor)logoBorderImagae.draw(in: logoFrame)let QRCodeImage = UIGraphicsGetImageFromCurrentImageContext()UIGraphicsEndImageContext()

封裝接口:

 /**   1.生成二維碼   - returns: 黑白普通二維碼(大小為300)   */  func generateQRCode() -> UIImage    /**   2.生成二維碼   - parameter size: 大小   - returns: 生成帶大小參數(shù)的黑白普通二維碼   */   func generateQRCodeWithSize(size:CGFloat?) -> UIImage     /**   3.生成二維碼   - parameter logo: 圖標(biāo)   - returns: 生成帶Logo二維碼(大小:300)   */   func generateQRCodeWithLogo(logo:UIImage?) -> UIImage     /**   4.生成二維碼   - parameter size: 大小   - parameter logo: 圖標(biāo)   - returns: 生成大小和Logo的二維碼   */  func generateQRCode(size:CGFloat?,logo:UIImage?) -> UIImage    /**   5.生成二維碼   - parameter size:  大小   - parameter color:  顏色   - parameter bgColor: 背景顏色   - parameter logo:  圖標(biāo)   - returns: 帶Logo、顏色二維碼   */  func generateQRCode(size:CGFloat?,color:UIColor?,bgColor:UIColor?,logo:UIImage?) -> UIImage    /**   6.生成二維碼   - parameter size:      大小   - parameter color:      顏色   - parameter bgColor:     背景顏色   - parameter logo:      圖標(biāo)   - parameter radius:     圓角   - parameter borderLineWidth: 線寬   - parameter borderLineColor: 線顏色   - parameter boderWidth:   帶寬   - parameter borderColor:   帶顏色   - returns: 自定義二維碼   */  func generateQRCode(size:CGFloat?,color:UIColor?,bgColor:UIColor?,logo:UIImage?,radius:CGFloat,borderLineWidth:CGFloat?,borderLineColor:UIColor?,boderWidth:CGFloat?,borderColor:UIColor?) -> UIImage使用DispatchQueue.global().async {let image = content.generateQRCodeWithLogo(logo: self.logoImageView.image)        DispatchQueue.main.async(execute: {          self.QRCodeImageView.image = image        })      }

3.識(shí)別二維碼

swift3.0二維碼掃描,swift3,掃描二維碼,ios,swift,二維碼生成

通過CIDetector識(shí)別二維碼

CIDetector用于分析CIImage,以得到CIFeature,每個(gè)CIDetector都要用一個(gè)探測(cè)器類型(NSString)來初始化。這個(gè)類型用于告訴探測(cè)器要找什么特征

1.識(shí)別圖片二維碼

  func recognizeQRCode() -> String?  {    let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy : CIDetectorAccuracyHigh])    let features = detector?.features(in: CoreImage.CIImage(cgImage: self.cgImage!))    guard (features?.count)! > 0 else { return nil }    let feature = features?.first as? CIQRCodeFeature    return feature?.messageString  }

使用實(shí)例

DispatchQueue.global().async {      let recognizeResult = self.sourceImage?.recognizeQRCode()      let result = recognizeResult?.characters.count > 0 ? recognizeResult : "無法識(shí)別"      DispatchQueue.main.async {        Tool.confirm(title: "掃描結(jié)果", message: result, controller: self)        self.activityIndicatoryView.stopAnimating()      }    }

本文Demo地址:QRCode.rar

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到IOS開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 越西县| 凤冈县| 淳安县| 师宗县| 车险| 桓台县| 印江| 平安县| 黔西县| 密山市| 邵阳市| 拉萨市| 曲靖市| 清丰县| 雷波县| 乳山市| 封丘县| 烟台市| 禄丰县| 新邵县| 建湖县| 迁西县| 江油市| 怀宁县| 乌兰县| 合作市| 留坝县| 娱乐| 万宁市| 高唐县| 汉中市| 山阳县| 磐安县| 灌阳县| 贵州省| 武隆县| 盐亭县| 渭源县| 信阳市| 湘西| 绍兴市|