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

首頁 > 系統 > iOS > 正文

ios swift3.0實現二維碼掃描、生成、識別示例代碼

2020-07-26 02:55:48
字體:
來源:轉載
供稿:網友

基于swift3.0

1.掃描二維碼


設置掃描會話,圖層和輸入輸出

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

開始掃描

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

掃描結果在代理方法中

//掃描捕捉完成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: "掃描結果", message: resultObj.stringValue, controller: self,handler: { (_) in          //繼續掃描          self.startScan()        })      }    }  }}

2.二維碼生成


通過濾鏡生成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: 生成帶大小參數的黑白普通二維碼   */   func generateQRCodeWithSize(size:CGFloat?) -> UIImage     /**   3.生成二維碼   - parameter logo: 圖標   - returns: 生成帶Logo二維碼(大小:300)   */   func generateQRCodeWithLogo(logo:UIImage?) -> UIImage     /**   4.生成二維碼   - parameter size: 大小   - parameter logo: 圖標   - returns: 生成大小和Logo的二維碼   */  func generateQRCode(size:CGFloat?,logo:UIImage?) -> UIImage    /**   5.生成二維碼   - parameter size:  大小   - parameter color:  顏色   - parameter bgColor: 背景顏色   - parameter logo:  圖標   - returns: 帶Logo、顏色二維碼   */  func generateQRCode(size:CGFloat?,color:UIColor?,bgColor:UIColor?,logo:UIImage?) -> UIImage    /**   6.生成二維碼   - parameter size:      大小   - parameter color:      顏色   - parameter bgColor:     背景顏色   - parameter logo:      圖標   - 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.識別二維碼


通過CIDetector識別二維碼

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

1.識別圖片二維碼

  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  }

使用實例

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

本文Demo地址:QRCode_jb51.rar

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 玉门市| 澳门| 阿瓦提县| 德钦县| 吉隆县| 德江县| 珠海市| 罗田县| 墨脱县| 昭苏县| 喀什市| 新疆| 阜城县| 城口县| 临夏县| 潞西市| 鹤山市| 郑州市| 万安县| 禄劝| 鲁甸县| 马鞍山市| 静安区| 定日县| 墨竹工卡县| 宜兰县| 客服| 驻马店市| 天祝| 新源县| 旬邑县| 米易县| 衡南县| 白河县| 望城县| 东阳市| 镇康县| 无极县| 贵溪市| 绍兴市| 定日县|