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:
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.
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.
http://download.csdn.net/detail/koocui/9857846
類擴充套件
import UIKit
extensionUIViewController{
func showAlert(title:String,message:S 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
使用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
最近又在倒騰二維碼,發現網上的教程都不夠用,所以把之前整合的二維碼Demo有拿出來重新新增些功能,這裡也算是重新學習吧!
當然對於二維碼,相信大家都很熟悉了。這裡就不多說。本專案是基於Zxing的開源專案開發的。
這裡用的Demo是之 之前寫過生成自定義二維碼的兩篇文章:《Android生成自定義二維碼》《Android生成二維碼–拍照或從相簿選取圖片》,下面就介紹一下Android應用內如何儲存以及分享二維碼圖片。
儲存圖片
Adnroid中儲存圖片可
實現相機掃描二維碼, 相簿選取圖片識別二維碼
一. 匯入 framework
import AVFoundation//二維碼掃描
import CoreImage//二維碼識別
import AudioToolbox//系統音效
二. 服從協議
AV 剛接觸APIcoud 的時候覺得很多模組真的好難,初次接觸二維碼的時候覺得,生成二維碼真的很費勁呢,其實不然,是真的很難,但是APIcoud 已經封裝好生成和掃描二維碼的模組,
我們只需要呼叫就可以愉快的使用二維碼了。
官方文件裡面的使用方法裡面,難免有些不易懂,本文教你如何愉快的開發二維碼模組。
廢話
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動態生成。
頁面的二維碼包含的資訊我在上一篇已經解釋過,是一個頁面的sessionID,這個sessionID主要是標示出哪個頁面是哪個頁面,例如你開啟N個頁面,必然每個頁面的標示會不一樣,只有你
目錄功能介紹根據之前公司的產品需求,參考 barcodescanner 改的,希望能幫助到有生成二維碼、掃描二維碼、識別圖片二維碼等需求的猿友。修改幅度較大,也就沒準備針對 barcodescanner 庫提交PR。 ZXing 生成可自定義顏色、帶 logo 的二維碼 ZX
三款ionic的掃描外掛。
各大部落格都有他們的介紹,我也不想贅述多少。
總結了下各大博主說的,反正是好壞都有,我給各位列個表格自己判斷吧
Barcode Scanner
速度慢,樣式機會為零
Zbar
速度快,ios樣式幾乎為零(槽點:連文字和木紋
import UIKit
import AVFoundation
protocol ScanViewDelegate: NSObjectProtocol{
/// 掃碼資料
///
/// - Parameter pileCode: 編碼
func cap
二維碼掃描使用最多的主要有兩個庫:zbarSDK 和zxing
關於zbar的使用比較簡單,在這裡不多說了,對於zxing的使用就比較麻煩,雖然網上有很多關於zxing的使用方法,不過查了很多中文和英文的貼子。發現說的都不夠詳細,對與像我這樣第一次搞的新手來說差一步就錯了很
XQRCode
一個非常方便實用的二維碼掃描、解析、生成庫
關於我
特點
支援快速整合條形碼、二維碼掃描功能。
支援自定義掃描介面。
支援生成帶圖示的二維碼。
支援生成帶背景圖片的複雜二維碼。
支援二維碼解析功能
1、
最近專案掃描藥品的ZXing,產品要加一個開啟和關閉閃光燈的功能(燈光暗的時候可以滿足使用者掃碼的需求),最後我會貼上我的程式碼
注意點:
問題一:在ZXing的CaptureActivity中,我們不能再建立Camera物件,因為系統就只有一個Ca
android方面的配置:配置環境,下載、編譯Zxing原始碼,整合進專案
1、環境下載、安裝,編譯Zxing原始碼
下載Zxing原始碼地址:https://github.com/zxing/zxing
其中android資料夾下為一個功能應用,有 相關推薦
swift版二維碼掃描和生成
Swift AVFoundation 二維碼掃描和生成
二維碼掃描和生成二維碼
QRCode二維碼掃描和生成
使用開原始碼實現二維碼掃描和生成
二維碼掃描,生成
基於Zxing的二維碼生成和二維碼掃描
Android生成二維碼--儲存和分享二維碼圖片
iOS 二維碼掃描 Swift
APIcoud 手機二維碼or條碼 生成與掃描模組
iOS 二維碼掃描 原生版
簡單的掃描二維碼吐司+生成二維碼
實現手機掃描二維碼頁面登入,類似web微信-第二篇,關於二維碼的自動生成
QRCode 掃描二維碼、掃描條形碼、相簿獲取圖片後識別、生成帶 Logo 二維碼、支援微博微信 QQ 二維碼掃描樣式
ionic3 二維碼掃描外掛 (Barcode Scanner 和 Zbar和 QR Scanner)的戰鬥
【Swift】原生二維碼掃描
zxing 二維碼掃描 配置和使用
XQRCode 一個非常方便實用的二維碼掃描、解析、生成庫
ZXing掃描二維碼 開啟和關閉,閃光燈
android 和 phonegap(Cordova)互動使用Zxing二維碼掃描