1. 程式人生 > >swift版二維碼掃描和生成

swift版二維碼掃描和生成

http://download.csdn.net/detail/koocui/9857846

類擴充套件

import UIKit

extensionUIViewController{

func showAlert(title:String,message:String,handler:@escaping((UIAlertAction)->Void)){

let alert:UIAlertController =UIAlertController(title: title, message: message, preferredStyle: .alert)

let action:

UIAlertAction =UIAlertAction(title: "確定", style: .default, handler: handler)

        alert.addAction(action)

self.present(alert, animated:true, completion: nil)

    }

}

一,二維碼掃描;

1,掃描頁面上面的View

//

//  MaskView.swift

//  二維碼

//

//  Created by CJW on 17/5/26.

//  Copyright © 2017 cjw. All rights reserved.

//

import UIKit

class MaskView: UIView {

var lineLayer:CALayer? =nil

// Only override draw() if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

overridefunc draw(_ rect:CGRect) {

let width:CGFloat = rect.size.width

let height:CGFloat = rect.

size.height

let pickingFieldWIdth:CGFloat =300

let pickingFieldHeight:CGFloat =300

let contextRef =UIGraphicsGetCurrentContext()

        contextRef!.saveGState()

//蒙版

        contextRef?.setFillColor(red:0, green: 0, blue:0, alpha: 0.35)

        contextRef?.setLineWidth(3)

let pickingFIeldRect =CGRect(x: (width - pickingFieldWIdth) /2, y: (height - pickingFieldHeight) /2, width: pickingFieldWIdth, height: pickingFieldHeight)

let pickingFieldPath =UIBezierPath(rect: pickingFIeldRect)

let bezierPathRect =UIBezierPath(rect: rect)

//填充使用奇偶法則

        bezierPathRect.usesEvenOddFillRule =true

        bezierPathRect.fill()

        contextRef?.setLineWidth(2)

//框框

        contextRef?.setStrokeColor(red:27/255.0, green:181/255.0, blue:254/255.0, alpha:1)

        pickingFieldPath.stroke()

        contextRef?.restoreGState()

self.layer.contentsGravity =kCAGravityCenter

    }

overridefunc awakeFromNib() {

super.awakeFromNib()

self.backgroundColor =UIColor.black.withAlphaComponent(0.4)

self.lineLayer =CALayer(layer: layer)

self.lineLayer?.contents =UIImage(named: "line")?.cgImage

self.layer.addSublayer(self.lineLayer!)

self.resumeAnimation()

NotificationCenter.default.addObserver(self, selector: #selector(resumeAnimation), name:NSNotification.Name.UIApplicationDidBecomeActive, object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(stopAnimation), name:NSNotification.Name.UIApplicationDidEnterBackground, object: nil)

    }

overridefunc layoutSubviews() {

super.layoutSubviews()

self.setNeedsDisplay()

self.lineLayer?.frame =CGRect(x: (self.frame.size.width - 300) / 2, y: (self.frame.size.height - 300) / 2, width:300, height: 2)

    }

func stopAnimation(){

self.lineLayer?.removeAnimation(forKey:"translationY")

    }

func resumeAnimation(){

let basic =CABasicAnimation(keyPath:"transform.translation.y")

        basic.fromValue = (0)

        basic.toValue = (300)

        basic.duration =1.5

        basic.repeatCount =Float(NSIntegerMax)

self.lineLayer?.add(basic, forKey:"translationY")

    }

}

2,掃描二維碼的VC

//

//  ScanViewController.swift

//  二維碼

//

//  Created by CJW on 17/5/26.

//  Copyright © 2017 cjw. All rights reserved.

//  掃描二維碼

import UIKit

import AVFoundation

class ScanViewController:UIViewController,AVCaptureMetadataOutputObjectsDelegate {

var flashOpen:Bool? =nil

privatelazyvar session:AVCaptureSession = {

//獲取攝像裝置

let device:AVCaptureDevice =AVCaptureDevice.defaultDevice(withMediaType:AVMediaTypeVideo)

//建立輸入流

var input:AVCaptureDeviceInput?

do {

let myinput:AVCaptureDeviceInput=tryAVCaptureDeviceInput(device: device)

            input = myinput

        }catchlet error asNSError{

print(error)

        }

//建立輸出流

let output:AVCaptureMetadataOutput =AVCaptureMetadataOutput()

        output.setMetadataObjectsDelegate(self, queue:DispatchQueue.main)

//設定掃描區域的比例

let width =300 / self.view.bounds.height

let height =300 / self.view.bounds.width

        output.rectOfInterest =CGRect(x: (1-width)/2, y: (1-height) / 2, width: width, height: height)

let session1 =AVCaptureSession()

//高質量採集率

        session1.canSetSessionPreset(AVCaptureSessionPresetHigh)

        session1.addInput(input)

        session1.addOutput(output)

//設定掃碼支援的編碼格式(這裡設定條形碼和二維碼相容)

        output.metadataObjectTypes = [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code]

return session1

    }()

overridefunc viewDidLoad() {

super.viewDidLoad()

self.navigationItem.rightBarButtonItem =UIBarButtonItem(title: "開啟閃光燈", style: .plain, target:self, action: #selector(rightBarButtonDidClick))

let layer:AVCaptureVideoPreviewLayer =AVCaptureVideoPreviewLayer(session:session)

        layer.videoGravity =AVLayerVideoGravityResizeAspectFill

        layer.frame =self.view.layer.bounds

self.view.layer.insertSublayer(layer, at: 0)

    }

overridefunc viewWillAppear(_ animated:Bool) {

super.viewWillAppear(animated)

self.session.startRunning()

    }

overridefunc viewWillDisappear(_ animated:Bool) {

super.viewWillDisappear(animated)

self.session.stopRunning()

    }

overridefunc didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

    }

//MARK: - AVCaptureMetadataOutputObjectsDelegate

func captureOutput(_ captureOutput:AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection:AVCaptureConnection!) {

if metadataObjects.count >0 {

self.session.stopRunning()

let metadataObject:AVMetadataMachineReadableCodeObject = metadataObjects.firstas! AVMetadataMachineReadableCodeObject

self.showAlert(title:"掃面結果", message: metadataObject.stringValue, handler: { (ht) in

self.session.startRunning()

            })

        }

    }

}

//開啟閃光燈

extensionScanViewController {

func rightBarButtonDidClick(btn:UIBarButtonItem){

self.flashOpen =!self.flashOpen!

let device:AVCaptureDevice =AVCaptureDevice.defaultDevice(withMediaType:AVMediaTypeAudio)

if device.hasTorch&& device.hasFlash {

ifself.flashOpen! {

self.navigationItem.rightBarButtonItem =UIBarButtonItem(title: "關閉閃光燈", style: .plain, target:self, action: #selector(rightBarButtonDidClick))

            }

            device.torchMode =AVCaptureTorchMode.on

            device.flashMode =AVCaptureFlashMode.on

        }else {

self.navigationItem.rightBarButtonItem =UIBarButtonItem(title: "開啟閃光燈", style: .plain, target:self, action: #selector(rightBarButtonDidClick))

            device.torchMode =AVCaptureTorchMode.off

              device.flashMode =AVCaptureFlashMode.off

        }

    }

}

二,識別圖片二維碼;

//

//  ImageViewController.swift

//  二維碼

//

//  Created by CJW on 17/5/26.

//  Copyright © 2017 cjw. All rights reserved.

//  長按識別二維碼

import UIKit

class ImageViewController:UIViewController,UINavigationControllerDelegate,UIImagePickerControllerDelegate{

@IBOutletweakvar imageView:UIImageView!

overridefunc viewDidLoad() {

super.viewDidLoad()

self.navigationItem.rightBarButtonItem =UIBarButtonItem(title: "從相簿獲取", style:UIBarButtonItemStyle.plain, target:self, action: #selector(rightBarBtnItemClick(item:)))

    }

overridefunc didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

    }

//MARK:- 從相簿選擇

func rightBarBtnItemClick(item:UIBarButtonItem){

ifUIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {

let controller =UIImagePickerController()

            controller.sourceType =UIImagePickerControllerSourceType.photoLibrary

            controller.delegate =self

self.present(controller, animated:true, completion: { 

            })

        }else {

self.showAlert(title:"提示", message:"裝置不支援訪問相簿", handler: { (text)in

            })

        }

    }

//MARK:- UIImagePickerControllerDeleGate

func imagePickerController(_ picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [String :Any]) {

        picker.dismiss(animated:true) { 

let image = info[UIImagePickerControllerOriginalImage]

self.imageView.image = imageas! UIImage?

        }

    }

//MARK:- 長按識別二維碼

@IBActionfunc handleLongPress(_ sender:UILongPressGestureRecognizer) {

if sender.state ==UIGestureRecognizerState.began {

self.findQRCodeFromImage(image:self.imageView.image!)

        }

    }

//

func  findQRCodeFromImage(image:UIImage){

let detector:CIDetector =CIDetector(ofType:CIDetectorTypeQRCode, context:nil, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])!

let faetures = detector.features(in:CIImage(cgImage: image.cgImage!))

if faetures.count >=1 {

let feature:CIQRCodeFeature = faetures.firstas! CIQRCodeFeature

self.showAlert(title:"掃描結果", message: feature.messageString!, handler: { (alert) in

            })

        }else {

self.showAlert(title:"提示", message:"圖片裡沒有二維碼", handler: { (alert)in

            })

        }

    }

}

三,識別圖片二維碼;

//

//  CreateViewController.swift

//  二維碼

//

//  Created by CJW on 17/5/26.

//  Copyright © 2017 cjw. All rights reserved.

//  生成二維碼

import UIKit

import CoreFoundation

privatelet kRandomColor =UIColor.creatColor(r:CGFloat(arc4random_uniform(255)), g:CGFloat(arc4random_uniform(255)), b:CGFloat(arc4random_uniform(255)))

privatelet qrImageSize =CGSize(width: 300, height:300)

class CreateViewController:UIViewController,UITextFieldDelegate {

@IBOutletweakvar textFiled:UITextField!

@IBOutletweakvar imageView:UIImageView!

overridefunc viewDidLoad() {

super.viewDidLoad()

self.imageView.image = self.createQRImageWithString("小崔哥", andSize: qrImageSize)


    }

func textFieldShouldReturn(_ textField:UITextField) -> Bool {

self.createButtonDidClick(UIButton())

returntrue

    }

//MARK:- methods

@IBActionfunc createButtonDidClick(_ sender:UIButton) {

self.textFiled.resignFirstResponder()

if (self.textFiled.text?.characters.count)! > 0 {

self.imageView.image =self.createQRImageWithString(self.textFiled.text!, andSize: qrImageSize)

        }else {

self.showAlert(title:"提示", message:"請先輸入文字", handler: { (alter)in

            })

        }

    }

//為二維碼改變顏色

@IBActionfunc changeColorButtonDidClick(_ sender:UIButton) {

let image =self.createQRImageWithString(self.textFiled.text!, andSize: qrImageSize)

self.imageView.image =self.changeColorForQRImage(iamge: image, backColor:kRandomColor, frontColor:kRandomColor)

    }

@IBActionfunc addSamllImageButtonDidClick(_ sender:UIButton) {

self.imageView.image =self.

相關推薦

swift掃描生成

http://download.csdn.net/detail/koocui/9857846 類擴充套件 import UIKit extensionUIViewController{ func showAlert(title:String,message:S

Swift AVFoundation 掃描生成

size ram post nserror out 捕獲 一個 白色 art 項目最終不須要支持iOS6了(淚崩),在二維碼掃描這一塊,可以全然的放棄ZXing庫,改用系統的AVFoundation了,拿swift寫了個Demo,效果例如以下: git

掃描生成

1.佈局 <?xml version="1.0" encoding="utf-8"?> <cn.bingoogolapple.qrcode.zxing.ZXingView android:id="@+id/zxing" and

QRCode掃描生成

使用zxing的第三方抽取包,簡單的幾行程式碼就可以完成。 首先,下載第三方抽取包libzxing 將其按一個model匯入到我們建好的app中,新增model引用,新增許可權。 model倒入後的結構如圖: 注意:因為許可權問題,我們在主程式程式碼中有一大段是對許可權的

使用開原始碼實現掃描生成

把BarCodeTest導到ADT中,然後建立自己的工程TestQRcode,並關聯BarCodeTest.在TestQRcode工程配置檔案中新增許可權 <uses-permission android:name="android.permis

掃描生成

首先是生成預設二維碼頁面 在點選事件裡跳轉到預設二維碼 case R.id.but1: //開啟預設二維碼掃描頁面 Intent intent = new Intent(MainActivity

基於Zxing的生成掃描

 最近又在倒騰二維碼,發現網上的教程都不夠用,所以把之前整合的二維碼Demo有拿出來重新新增些功能,這裡也算是重新學習吧!      當然對於二維碼,相信大家都很熟悉了。這裡就不多說。本專案是基於Zxing的開源專案開發的。      這裡用的Demo是之

Android生成--儲存分享圖片

    之前寫過生成自定義二維碼的兩篇文章:《Android生成自定義二維碼》《Android生成二維碼–拍照或從相簿選取圖片》,下面就介紹一下Android應用內如何儲存以及分享二維碼圖片。   儲存圖片      Adnroid中儲存圖片可

iOS 掃描 Swift

實現相機掃描二維碼, 相簿選取圖片識別二維碼     一. 匯入 framework import AVFoundation//二維碼掃描 import CoreImage//二維碼識別 import AudioToolbox//系統音效 二. 服從協議 AV

APIcoud 手機or條碼 生成掃描模組

剛接觸APIcoud 的時候覺得很多模組真的好難,初次接觸二維碼的時候覺得,生成二維碼真的很費勁呢,其實不然,是真的很難,但是APIcoud 已經封裝好生成和掃描二維碼的模組, 我們只需要呼叫就可以愉快的使用二維碼了。 官方文件裡面的使用方法裡面,難免有些不易懂,本文教你如何愉快的開發二維碼模組。 廢話

iOS 掃描 原生

     iOS掃描有很多非常成熟的第三方應用,從iOS7以後開始支援原生掃描二維碼,而且效率非常高,整合也很簡單.下面我們來寫下原生掃描方法.直接上圖.swfit 版本. var device: AVCaptureDevice!

簡單的掃描吐司+生成

1.匯入依賴(build.gradle) implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.3.4' 2.MainActivity頁面 public class MainActivity extends AppCompat

實現手機掃描頁面登入,類似web微信-第二篇,關於的自動生成

接上一章,我們已經基本把業務邏輯分析清楚了 下面我們第一步,實現二維碼的web動態生成。 頁面的二維碼包含的資訊我在上一篇已經解釋過,是一個頁面的sessionID,這個sessionID主要是標示出哪個頁面是哪個頁面,例如你開啟N個頁面,必然每個頁面的標示會不一樣,只有你

QRCode 掃描掃描條形碼、相簿獲取圖片後識別、生成帶 Logo 、支援微博微信 QQ 掃描樣式

目錄功能介紹根據之前公司的產品需求,參考 barcodescanner 改的,希望能幫助到有生成二維碼、掃描二維碼、識別圖片二維碼等需求的猿友。修改幅度較大,也就沒準備針對 barcodescanner 庫提交PR。 ZXing 生成可自定義顏色、帶 logo 的二維碼 ZX

ionic3 掃描外掛 (Barcode Scanner Zbar QR Scanner)的戰鬥

三款ionic的掃描外掛。 各大部落格都有他們的介紹,我也不想贅述多少。 總結了下各大博主說的,反正是好壞都有,我給各位列個表格自己判斷吧 Barcode Scanner 速度慢,樣式機會為零 Zbar 速度快,ios樣式幾乎為零(槽點:連文字和木紋

Swift】原生掃描

import UIKit import AVFoundation protocol ScanViewDelegate: NSObjectProtocol{ /// 掃碼資料 /// /// - Parameter pileCode: 編碼 func cap

zxing 掃描 配置使用

二維碼掃描使用最多的主要有兩個庫:zbarSDK 和zxing 關於zbar的使用比較簡單,在這裡不多說了,對於zxing的使用就比較麻煩,雖然網上有很多關於zxing的使用方法,不過查了很多中文和英文的貼子。發現說的都不夠詳細,對與像我這樣第一次搞的新手來說差一步就錯了很

XQRCode 一個非常方便實用的掃描、解析、生成

XQRCode 一個非常方便實用的二維碼掃描、解析、生成庫 關於我 特點 支援快速整合條形碼、二維碼掃描功能。 支援自定義掃描介面。 支援生成帶圖示的二維碼。 支援生成帶背景圖片的複雜二維碼。 支援二維碼解析功能 1、

ZXing掃描 開啟關閉,閃光燈

最近專案掃描藥品的ZXing,產品要加一個開啟和關閉閃光燈的功能(燈光暗的時候可以滿足使用者掃碼的需求),最後我會貼上我的程式碼 注意點: 問題一:在ZXing的CaptureActivity中,我們不能再建立Camera物件,因為系統就只有一個Ca

android phonegap(Cordova)互動使用Zxing掃描

android方面的配置:配置環境,下載、編譯Zxing原始碼,整合進專案 1、環境下載、安裝,編譯Zxing原始碼 下載Zxing原始碼地址:https://github.com/zxing/zxing 其中android資料夾下為一個功能應用,有