swift之生成条形码、二维码、识别二维码、长按识别二维码
2018-03-02 16:00
761 查看
========//生成条形码========== func generateBarCode(messgae:NSString,width:CGFloat,height:CGFloat) -> UIImage { var returnImage:UIImage? if (messgae.length > 0 && width > 0 && height > 0){ let inputData:NSData? = messgae.data(using: String.Encoding.utf8.rawValue)! as NSData // CICode128BarcodeGenerator let filter = CIFilter.init(name: "CICode128BarcodeGenerator")! filter.setValue(inputData, forKey: "inputMessage") var ciImage = filter.outputImage! let scaleX = width/ciImage.extent.size.width let scaleY = height/ciImage.extent.size.height ciImage = ciImage.transformed(by: CGAffineTransform.init(scaleX: scaleX, y: scaleY)) returnImage = UIImage.init(ciImage: ciImage) }else { returnImage = nil; } return returnImage! }
=======生成二维码========
主要用到
通常
其中
override func viewDidLoad() { //不带图片的二维码图片 let imageViewIcon1 = UIImageView(frame:CGRect(x: 20, y: 100, width: 100, height: 100)) imageViewIcon1.image = createQRForString(qrString: "https://www.baidu.com", qrImageName: "") self.view.addSubview(imageViewIcon1) //带图片的二维码图片 let imageViewIcon2 = UIImageView(frame: CGRect(x: 200, y: 100, width: 100, height: 100)) imageViewIcon2.image = createQRForString(qrString: "https://www.baidu.com", qrImageName: "298huiyuan") self.view.addSubview(imageViewIcon2) }
func createQRForString(qrString: String?, qrImageName: String?) -> UIImage?{ if let sureQRString = qrString{ let stringData = sureQRString.data(using: String.Encoding.utf8, allowLossyConversion: false) //创建一个二维码的滤镜 let qrFilter = CIFilter(name: "CIQRCodeGenerator") qrFilter?.setValue(stringData, forKey: "inputMessage") qrFilter?.setValue("H", forKey: "inputCorrectionLevel") let qrCIImage = qrFilter?.outputImage // 创建一个颜色滤镜,黑白色 let colorFilter = CIFilter(name: "CIFalseColor")! colorFilter.setDefaults() colorFilter.setValue(qrCIImage, forKey: "inputImage") colorFilter.setValue(CIColor(red: 0, green: 0, blue: 0), forKey: "inputColor0") colorFilter.setValue(CIColor(red: 1, green: 1, blue: 1), forKey: "inputColor1") // 返回二维码image let codeImage = UIImage(ciImage: (colorFilter.outputImage!.transformed(by: CGAffineTransform(scaleX: 5, y: 5)))) // 中间一般放logo if let iconImage = UIImage(named: qrImageName!) { let rect = CGRect(x: 0, y: 0, width: codeImage.size.width, height: codeImage.size.height) UIGraphicsBeginImageContext(rect.size) codeImage.draw(in: rect) let avatarSize = CGSize(width: rect.size.width*0.25, height: rect.size.height*0.25) let x = (rect.width - avatarSize.width) * 0.5 let y = (rect.height - avatarSize.height) * 0.5 iconImage.draw(in: CGRect(x: x, y: y, width: avatarSize.width, height: avatarSize.height)) let resultImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return resultImage } return codeImage } return nil }
=========扫描二维码========
参考(二维码生成和识别):http://blog.csdn.net/qq_30970529/article/details/52233292
二维码扫描主要用
主要成员介绍:
import UIKitimport AVFoundationimport SafariServicesclass RecordManager : LYBBaseVC {
var session:AVCaptureSession?//会话,用于协调输入输出 var output:AVCaptureMetadataOutput?//输出 var input:AVCaptureDeviceInput?//输入 var layer:AVCaptureVideoPreviewLayer?//特殊的layer,用于展示搜索到的内容--- var recImageView:UIImageView?//矩形框 var lineImageView:UIImageView?//闪动的线 var timer:Timer? //判断相机的权限 func testCamera() { let authorizationStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video) switch authorizationStatus { case .notDetermined: AVCaptureDevice.requestAccess(for: AVMediaType.video) { (genter) in if (genter){ print("去打开相机") }else{ print(">>>访问受限") } } break case .authorized: print("去打开相机") break case .restricted: print(">>>访问受限") break case .denied: print(">>>访问受限") break } } //打开相机扫描 func saomiaoErweima(){ //打开相机
let device=AVCaptureDevice.default(for: AVMediaType.video) //创建输入流 input = try? AVCaptureDeviceInput.init(device: device!) //创建输出流 output=AVCaptureMetadataOutput.init() //设置代理在主线程里刷新
output?.setMetadataObjectsDelegate(self, queue: DispatchQueue.main ) //设置扫描区域,这个需要仔细调整
output?.rectOfInterest=CGRect.init(x: 50, y: 50, width: 200, height: 200) //初始化链接对象,连接输入输出 session=AVCaptureSession.init() //高质量采集率 session?.sessionPreset=AVCaptureSession.Preset.high session?.addInput(input!) session?.addOutput(output!) //设置扫码支持的编码格式 output?.metadataObjectTypes=[AVMetadataObject.ObjectType.qr,AVMetadataObject.ObjectType.ean13,AVMetadataObject.ObjectType.ean8,AVMetadataObject.ObjectType.code128]
layer=AVCaptureVideoPreviewLayer.init(session: session!) layer?.videoGravity=AVLayerVideoGravity.resizeAspectFill layer?.frame=self.view.layer.bounds self.view.layer.addSublayer(layer!) setline()//添加扫框//开始扫描 session?.startRunning() } //设置最上面的框和跳动的线 func setline(){ //设置背景图片 recImageView = UIImageView.init(image: UIImage.init(named: "a.png")) //设置位置到界面的中间 recImageView?.frame = CGRect.init(x: view.bounds.size.width * 0.5 - 140, y: view.bounds.size.height * 0.5 - 140, width: 280, height: 280) //添加到视图上 view.addSubview(recImageView!) //初始化二维码的扫描线的位置 lineImageView=UIImageView.init(image: UIImage.init(named: "line.png")) lineImageView?.frame=CGRect.init(x: 30, y: 10, width: 220, height: 2) view.addSubview(lineImageView!) //开启定时器 timer=Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(animate), userInfo: nil, repeats: true) } @objc func animate() { UIView.animate(withDuration: 3, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: { self.lineImageView?.frame=CGRect.init(x: 30, y: 260, width: 220, height: 2) }) { (ist) in self.lineImageView?.frame=CGRect.init(x: 30, y: 10, width: 220, height: 2) } }}
/// 实现代理方法--获取数据//metadataObjects: 扫描到的数据//fromConnection: 连接extension RecordManager:AVCaptureMetadataOutputObjectsDelegate { func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { //停止扫描 session?.stopRunning() //删除特殊的layer layer?.removeFromSuperlayer() // //3. 获取数据 //AVMetadataMachineReadableCodeObject:这个类如果不知道,可以打印一下 let metadataObject = metadataObjects.first as! AVMetadataMachineReadableCodeObject var decodeMessage = "" switch metadataObject.type { case AVMetadataObject.ObjectType.code128: // 条形码 decodeMessage = metadataObject.stringValue! break case AVMetadataObject.ObjectType.qr: // 二维码 decodeMessage = metadataObject.stringValue! break case AVMetadataObject.ObjectType.ean13: // ISBN书号条码、EAN13码 decodeMessage = metadataObject.stringValue! break default: break } print(decodeMessage) if (metadataObject.stringValue?.contains("http"))!{ //4.1 创建SafariVC----如果要打开safari浏览器,需要引入import SafariServices let sfvc:SFSafariViewController=SFSafariViewController.init(url: URL.init(string: metadataObject.stringValue! )!) //4.2 弹出SafariVC self.present(sfvc, animated: true, completion: { }) } }}
===========长按识别二维码=========
func longPressRecogErwema() { imageView = UIImageView.init(frame: CGRect.init(x: 100, y: 100, width: 200, height: 200)) imageView.image = UIImage.init(named: "a.png") imageView.isUserInteractionEnabled = true self.view.addSubview(imageView) //长按识别二维码 let longPress = UILongPressGestureRecognizer.init(target: self, action: #selector(QRLongPress(gesture:))) longPress.minimumPressDuration = 1 imageView.addGestureRecognizer(longPress) } //MARK: - 长按二维码识别 func QRLongPress(gesture: UILongPressGestureRecognizer) { if (gesture.state == UIGestureRecognizerState.began) { //1.初始化扫描仪,设置设别类型和识别质量 let options = ["IDetectorAccuracy" : CIDetectorAccuracyHigh] let detector: CIDetector = CIDetector.init(ofType: "CIDetectorTypeQRCode", context: nil, options: options)! //2.扫描获取的特征组 let features = detector.features(in: CIImage.init(cgImage: (self.imageView.image?.cgImage)!)) //3.获取扫描结果 let feature = features[0] as! CIQRCodeFeature let scannedResult = feature.messageString //4.获取之后的操作---根据扫描结果中的数据进行具体的操作 print(scannedResult!) } else if (gesture.state == UIGestureRecognizerState.ended) { } }
=======生成二维码========
主要用到
CIFilter类。
CIFilter是Core Image中一个比较核心的有关滤镜使用的类。
通常
CIFilter对象需要一个或多个图像作为输入,并产生
CIImage类型的实体作为输出。而这些输出图像的生产过程需要我们通过设置一些参数来实现,而这些参数的设置和检索都是利用键/值对的形式进行操作的。
其中
CIFlilter承载着所有设置好的滤镜参数以
CIImage为基础,在
CIContext对象中进行渲染。要提一下的是滤镜的使用是可以叠加的,我们可以使用多种滤镜处理同一个图像。
Core Image的渲染分为CPU和GPU两种,其中使用CPU渲染可以在后台进行,但是渲染速度没有GPU快,而GPU是不能进行后台渲染的它是实时的,在进行视频帧渲染时我们就可以使用GPU进行渲染。
override func viewDidLoad() { //不带图片的二维码图片 let imageViewIcon1 = UIImageView(frame:CGRect(x: 20, y: 100, width: 100, height: 100)) imageViewIcon1.image = createQRForString(qrString: "https://www.baidu.com", qrImageName: "") self.view.addSubview(imageViewIcon1) //带图片的二维码图片 let imageViewIcon2 = UIImageView(frame: CGRect(x: 200, y: 100, width: 100, height: 100)) imageViewIcon2.image = createQRForString(qrString: "https://www.baidu.com", qrImageName: "298huiyuan") self.view.addSubview(imageViewIcon2) }
func createQRForString(qrString: String?, qrImageName: String?) -> UIImage?{ if let sureQRString = qrString{ let stringData = sureQRString.data(using: String.Encoding.utf8, allowLossyConversion: false) //创建一个二维码的滤镜 let qrFilter = CIFilter(name: "CIQRCodeGenerator") qrFilter?.setValue(stringData, forKey: "inputMessage") qrFilter?.setValue("H", forKey: "inputCorrectionLevel") let qrCIImage = qrFilter?.outputImage // 创建一个颜色滤镜,黑白色 let colorFilter = CIFilter(name: "CIFalseColor")! colorFilter.setDefaults() colorFilter.setValue(qrCIImage, forKey: "inputImage") colorFilter.setValue(CIColor(red: 0, green: 0, blue: 0), forKey: "inputColor0") colorFilter.setValue(CIColor(red: 1, green: 1, blue: 1), forKey: "inputColor1") // 返回二维码image let codeImage = UIImage(ciImage: (colorFilter.outputImage!.transformed(by: CGAffineTransform(scaleX: 5, y: 5)))) // 中间一般放logo if let iconImage = UIImage(named: qrImageName!) { let rect = CGRect(x: 0, y: 0, width: codeImage.size.width, height: codeImage.size.height) UIGraphicsBeginImageContext(rect.size) codeImage.draw(in: rect) let avatarSize = CGSize(width: rect.size.width*0.25, height: rect.size.height*0.25) let x = (rect.width - avatarSize.width) * 0.5 let y = (rect.height - avatarSize.height) * 0.5 iconImage.draw(in: CGRect(x: x, y: y, width: avatarSize.width, height: avatarSize.height)) let resultImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return resultImage } return codeImage } return nil }
=========扫描二维码========
参考(二维码生成和识别):http://blog.csdn.net/qq_30970529/article/details/52233292
二维码扫描主要用
AVFoundation。
AVFoundation是一个很大基础库,用来创建基于时间的视听媒体,可以使用它来检查,创建、编辑或媒体文件。也可以输入流从设备和操作视频实时捕捉和回放。
主要成员介绍:
AVCaptureSession管理输入(
AVCaptureInput)和输出(
AVCaptureOutput)流,包含开启和停止会话方法。
AVCaptureDeviceInput是
AVCaptureInput的子类,可以作为输入捕获会话,用
AVCaptureDevice实例初始化。
AVCaptureDevice代表了物理捕获设备如:摄像机。用于配置等底层硬件设置相机的自动对焦模式。
AVCaptureMetadataOutput是
AVCaptureOutput的子类,处理输出捕获会话。捕获的对象传递给一个委托实现
AVCaptureMetadataOutputObjectsDelegate协议。协议方法在指定的派发队列(
dispatch queue)上执行。
AVCaptureVideoPreviewLayerCALayer的一个子类,显示捕获到的相机输出流。
import UIKitimport AVFoundationimport SafariServicesclass RecordManager : LYBBaseVC {
var session:AVCaptureSession?//会话,用于协调输入输出 var output:AVCaptureMetadataOutput?//输出 var input:AVCaptureDeviceInput?//输入 var layer:AVCaptureVideoPreviewLayer?//特殊的layer,用于展示搜索到的内容--- var recImageView:UIImageView?//矩形框 var lineImageView:UIImageView?//闪动的线 var timer:Timer? //判断相机的权限 func testCamera() { let authorizationStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video) switch authorizationStatus { case .notDetermined: AVCaptureDevice.requestAccess(for: AVMediaType.video) { (genter) in if (genter){ print("去打开相机") }else{ print(">>>访问受限") } } break case .authorized: print("去打开相机") break case .restricted: print(">>>访问受限") break case .denied: print(">>>访问受限") break } } //打开相机扫描 func saomiaoErweima(){ //打开相机
let device=AVCaptureDevice.default(for: AVMediaType.video) //创建输入流 input = try? AVCaptureDeviceInput.init(device: device!) //创建输出流 output=AVCaptureMetadataOutput.init() //设置代理在主线程里刷新
output?.setMetadataObjectsDelegate(self, queue: DispatchQueue.main ) //设置扫描区域,这个需要仔细调整
output?.rectOfInterest=CGRect.init(x: 50, y: 50, width: 200, height: 200) //初始化链接对象,连接输入输出 session=AVCaptureSession.init() //高质量采集率 session?.sessionPreset=AVCaptureSession.Preset.high session?.addInput(input!) session?.addOutput(output!) //设置扫码支持的编码格式 output?.metadataObjectTypes=[AVMetadataObject.ObjectType.qr,AVMetadataObject.ObjectType.ean13,AVMetadataObject.ObjectType.ean8,AVMetadataObject.ObjectType.code128]
layer=AVCaptureVideoPreviewLayer.init(session: session!) layer?.videoGravity=AVLayerVideoGravity.resizeAspectFill layer?.frame=self.view.layer.bounds self.view.layer.addSublayer(layer!) setline()//添加扫框//开始扫描 session?.startRunning() } //设置最上面的框和跳动的线 func setline(){ //设置背景图片 recImageView = UIImageView.init(image: UIImage.init(named: "a.png")) //设置位置到界面的中间 recImageView?.frame = CGRect.init(x: view.bounds.size.width * 0.5 - 140, y: view.bounds.size.height * 0.5 - 140, width: 280, height: 280) //添加到视图上 view.addSubview(recImageView!) //初始化二维码的扫描线的位置 lineImageView=UIImageView.init(image: UIImage.init(named: "line.png")) lineImageView?.frame=CGRect.init(x: 30, y: 10, width: 220, height: 2) view.addSubview(lineImageView!) //开启定时器 timer=Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(animate), userInfo: nil, repeats: true) } @objc func animate() { UIView.animate(withDuration: 3, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: { self.lineImageView?.frame=CGRect.init(x: 30, y: 260, width: 220, height: 2) }) { (ist) in self.lineImageView?.frame=CGRect.init(x: 30, y: 10, width: 220, height: 2) } }}
/// 实现代理方法--获取数据//metadataObjects: 扫描到的数据//fromConnection: 连接extension RecordManager:AVCaptureMetadataOutputObjectsDelegate { func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { //停止扫描 session?.stopRunning() //删除特殊的layer layer?.removeFromSuperlayer() // //3. 获取数据 //AVMetadataMachineReadableCodeObject:这个类如果不知道,可以打印一下 let metadataObject = metadataObjects.first as! AVMetadataMachineReadableCodeObject var decodeMessage = "" switch metadataObject.type { case AVMetadataObject.ObjectType.code128: // 条形码 decodeMessage = metadataObject.stringValue! break case AVMetadataObject.ObjectType.qr: // 二维码 decodeMessage = metadataObject.stringValue! break case AVMetadataObject.ObjectType.ean13: // ISBN书号条码、EAN13码 decodeMessage = metadataObject.stringValue! break default: break } print(decodeMessage) if (metadataObject.stringValue?.contains("http"))!{ //4.1 创建SafariVC----如果要打开safari浏览器,需要引入import SafariServices let sfvc:SFSafariViewController=SFSafariViewController.init(url: URL.init(string: metadataObject.stringValue! )!) //4.2 弹出SafariVC self.present(sfvc, animated: true, completion: { }) } }}
===========长按识别二维码=========
func longPressRecogErwema() { imageView = UIImageView.init(frame: CGRect.init(x: 100, y: 100, width: 200, height: 200)) imageView.image = UIImage.init(named: "a.png") imageView.isUserInteractionEnabled = true self.view.addSubview(imageView) //长按识别二维码 let longPress = UILongPressGestureRecognizer.init(target: self, action: #selector(QRLongPress(gesture:))) longPress.minimumPressDuration = 1 imageView.addGestureRecognizer(longPress) } //MARK: - 长按二维码识别 func QRLongPress(gesture: UILongPressGestureRecognizer) { if (gesture.state == UIGestureRecognizerState.began) { //1.初始化扫描仪,设置设别类型和识别质量 let options = ["IDetectorAccuracy" : CIDetectorAccuracyHigh] let detector: CIDetector = CIDetector.init(ofType: "CIDetectorTypeQRCode", context: nil, options: options)! //2.扫描获取的特征组 let features = detector.features(in: CIImage.init(cgImage: (self.imageView.image?.cgImage)!)) //3.获取扫描结果 let feature = features[0] as! CIQRCodeFeature let scannedResult = feature.messageString //4.获取之后的操作---根据扫描结果中的数据进行具体的操作 print(scannedResult!) } else if (gesture.state == UIGestureRecognizerState.ended) { } }
相关文章推荐
- .NET C#利用ZXing生成、识别二维码/条形码
- 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式
- 二维码的生成 识别 扫描 封装(Swift)
- .NET C#利用ZXing生成、识别二维码/条形码
- Swift_二维码、条形码的生成
- Swift之二维码的生成、识别和扫描
- android开发游记:二维码和条形码的识别和生成
- 二维码与条形码的生成和识别使用
- swift 扫描二维码/条形码,开启闪光灯,识别相册二维码
- QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式
- iOS生成二维码(中间包含图片),长按识别二维码(Swift)
- android二维码、条形码生成与扫描识别
- Android 二维码 生成和识别(转)
- Android之zxing二维码生成与识别
- swift生成二维码,扫描二维码
- Android开发之二维码生成与识别
- 在iOS上实现二维码功能、二维码、条形码、swift 二维码
- 详细易懂的二维码的扫描、识别与生成
- 【Demo】 生成二维码 和 条形码
- 详细易懂的二维码的扫描、识别与生成