日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift5以及IOS15对于二维码的使用

發布時間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift5以及IOS15对于二维码的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Swift5以及IOS15對于二維碼的使用

info.plist 加入這句話,而且第三個功能必須在真機上運行,模擬機不行。

Privacy - Camera Usage Description


OC方式:

一,二維碼生成:

關鍵性代碼:

- (void)viewDidLoad {[super viewDidLoad];//self.qrImageView.image = [GeneratorQRCodeVC creatQRImage:@"123" withSize:200];UIImage *image1 = [GeneratorQRCodeVC creatQRImage:@"123" withSize:200];UIImage *center = [UIImage imageNamed:@"zhengshuang.jpeg"];image1 = [self getNewImage:image1 withCenter:center];self.qrImageView.image = image1; } +(UIImage *)creatQRImage:(NSString *)url withSize:(CGFloat)size{CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];[filter setDefaults];NSString *string = url;NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];[filter setValue:data forKeyPath:@"inputMessage"];CIImage *img= [filter outputImage];return [self setQRImage:img withSize:size]; } +(UIImage *)setQRImage:(CIImage *)image withSize:(CGFloat)size{CGRect extent = CGRectIntegral(image.extent);CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));size_t width = CGRectGetWidth(extent) * scale;size_t height = CGRectGetHeight(extent) * scale;CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);CIContext *context = [CIContext contextWithOptions:nil];CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);CGContextScaleCTM(bitmapRef, scale, scale);CGContextDrawImage(bitmapRef, extent, bitmapImage);CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);CGContextRelease(bitmapRef);CGImageRelease(bitmapImage);return [UIImage imageWithCGImage:scaledImage]; } -(UIImage *)getNewImage:(UIImage *)sourceImage withCenter:(UIImage *)center{CGSize size = sourceImage.size;UIGraphicsBeginImageContext(sourceImage.size);[sourceImage drawInRect:CGRectMake(0, 0, size.width, size.height)];CGFloat width = 40,height = 40;CGFloat x = (size.width - width) / 2;CGFloat y = (size.height - height) / 2;[center drawInRect:CGRectMake(x, y, width, height)];UIImage *resultImgae = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return resultImgae; } @end

利用圖形上下文,繪制了一個小圖在圖片內部,

二,二維碼識別:

- (IBAction)shiBie:(id)sender {UIImage *image = self.sourceImageView.image;CIImage *imageCI = [[CIImage alloc] initWithImage:image];//開始識別//創建一個二維碼探測器CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];//直接探測二維碼特征NSString *strMSg = nil;NSArray<CIFeature *> *features = [detector featuresInImage:imageCI];for (CIFeature *feature in features) {CIQRCodeFeature *qrFeatrue = (CIQRCodeFeature *)feature;NSLog(@"%@",qrFeatrue.messageString);strMSg = qrFeatrue.messageString;}UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"結果" message:strMSg preferredStyle:UIAlertControllerStyleAlert];[self presentViewController:alert animated:YES completion:nil];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[alert dismissViewControllerAnimated:YES completion:nil];}); }

我這里識別的是單一的圖片??梢宰R別多張圖片。

三,掃描二維碼:

掃描是最難的,最麻煩的。

// // ScanQRCodeVC.m // 01-掌握二維碼綜合案例OC // // Created by lujun on 2021/11/4. // #import <AVFoundation/AVFoundation.h> #import "ScanQRCodeVC.h" #import "UIView+Frame.h" @interface ScanQRCodeVC ()<AVCaptureVideoDataOutputSampleBufferDelegate> @property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomConstan; @property (weak, nonatomic) IBOutlet UIImageView *qrBackView; @property(nonatomic,weak)AVCaptureSession *session; @end @implementation ScanQRCodeVC - (void)viewDidAppear:(BOOL)animated{[super viewDidAppear:animated];self.bottomConstan.constant = self.qrBackView.hm_height;[self.view layoutIfNeeded];self.bottomConstan.constant = -self.qrBackView.hm_height;[UIView animateWithDuration:2 animations:^{[UIView setAnimationsEnabled:YES];[UIView setAnimationRepeatCount:MAXFLOAT];[self.view layoutIfNeeded];}]; } - (void)viewDidLoad {[super viewDidLoad];[self setupCaptureSession]; } - (void)setupCaptureSession {NSError *error = nil;AVCaptureSession *session = [[AVCaptureSession alloc] init];//負責輸入和輸出設置之間的數據傳遞session.sessionPreset = AVCaptureSessionPresetMedium;//設置分辨率AVCaptureDevice *device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:deviceerror:&error];if (!input) {}AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];//創建一個視頻數據輸出流if([session canAddInput:input] && [session canAddOutput:output] ){[session addInput:input];[session addOutput:output];}dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);[output setSampleBufferDelegate:self queue:queue];// Specify the pixel formatoutput.videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey,[NSNumber numberWithInt: 320], (id)kCVPixelBufferWidthKey,[NSNumber numberWithInt: 240], (id)kCVPixelBufferHeightKey,nil];AVCaptureVideoPreviewLayer* preLayer = [AVCaptureVideoPreviewLayer layerWithSession: session];//相機拍攝預覽圖層//preLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];preLayer.frame = CGRectMake(0, 0, 320, 240);preLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;[self.view.layer addSublayer:preLayer];output.minFrameDuration = CMTimeMake(1, 15);[session startRunning]; }- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBufferfromConnection:(AVCaptureConnection *)connection {UIImage *image = [self imageFromSampleBuffer:sampleBuffer]; } - (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer {CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);CVPixelBufferLockBaseAddress(imageBuffer, 0);void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);size_t width = CVPixelBufferGetWidth(imageBuffer);size_t height = CVPixelBufferGetHeight(imageBuffer);CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);CGImageRef quartzImage = CGBitmapContextCreateImage(context);CVPixelBufferUnlockBaseAddress(imageBuffer,0);CGContextRelease(context);CGColorSpaceRelease(colorSpace);UIImage *image = [UIImage imageWithCGImage:quartzImage];CGImageRelease(quartzImage);return (image); } @end

swift方式:

一。二維碼的生成

override func viewDidLoad() {let str = inputTextView.text ?? ""super.viewDidLoad()self.title = "二維碼生成";let filter = CIFilter(name: "CIQRCodeGenerator")filter?.setDefaults()let data = str.data(using: String.Encoding.utf8)filter?.setValue(data, forKey: "inputMessage")filter?.setValue("H", forKey: "inputCorrectionLevel")var image = filter?.outputImagelet transform = CGAffineTransform(scaleX: 20, y: 20)image = image?.transformed(by: transform)var resultImage = UIImage(ciImage: image!)let center = UIImage(named: "zhengshuang.jpeg")!resultImage = getNewImage(sourceImage: resultImage, center: center)qrCodeImageView.image = resultImage}func getNewImage(sourceImage: UIImage,center: UIImage) -> UIImage {let size = sourceImage.sizeUIGraphicsBeginImageContext(size)sourceImage.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))let width: CGFloat = 80let height: CGFloat = 80let x: CGFloat = (size.width - width) * 0.5let y: CGFloat = (size.height - height) * 0.5center.draw(in: CGRect(x: x, y: y, width: width, height: height))let resultImage = UIGraphicsGetImageFromCurrentImageContext()!UIGraphicsEndImageContext()return resultImage}

二,二維碼的識別

let image = sourceImageView.imagelet imageCI = CIImage(image: image!)//開始識別//創建一個二維碼探測器let dector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])//直接探測二維碼特征let features = dector?.features(in: imageCI!)var resultImage = imagevar strMsg: String?var strMsgArr = [String]()for feature in features! { // debugPrint(feature)let qrFeature = feature as! CIQRCodeFeaturedebugPrint(qrFeature.messageString)strMsgArr.append(qrFeature.messageString!) // debugPrint(qrFeature.bounds)resultImage = drawFrame(image: resultImage!, feature: qrFeature)sourceImageView.image = resultImagestrMsg = qrFeature.messageString}debugPrint(strMsg?.count)let al = UIAlertController(title: "結果", message: strMsgArr.description, preferredStyle: .alert)let action = UIAlertAction(title: "關閉", style: .cancel, handler: nil)self .present(al, animated: true, completion: nil)al.addAction(action) func drawFrame(image:UIImage,feature: CIQRCodeFeature) ->UIImage {let size = image.sizeUIGraphicsBeginImageContext(size)image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))//轉換坐標系 (上下顛倒)開始let context = UIGraphicsGetCurrentContext()!context.scaleBy(x: 1, y: -1)context.translateBy(x: 0, y: -size.height) // CGContextScaleCTM(context,1,-1) 函數過期 // CGContextTranslateCTM(context,0,-size.height) 函數過期//轉換坐標系 (上下顛倒) 結束let bounds = feature.boundslet path = UIBezierPath(rect: bounds)path.lineWidth = 6UIColor.red.setStroke()path.stroke()let resultImage = UIGraphicsGetImageFromCurrentImageContext()UIGraphicsEndImageContext()return resultImage!}

三,掃描二維碼

import UIKit import AVFoundation class ScanQRCodeVC: UIViewController {var session: AVCaptureSession?weak var layer: AVCaptureVideoPreviewLayer?@IBOutlet weak var chongjiBoView: UIImageView!@IBOutlet weak var scanBackVIew: UIView!@IBOutlet weak var toBottom: NSLayoutConstraint!override func viewDidLoad() {super.viewDidLoad()title = "掃描二維碼"}func startScan() -> Void{//1.獲取 攝像頭設備let device: AVCaptureDevice = AVCaptureDevice.default(for: .video)!var input: AVCaptureDeviceInput?do {input = try AVCaptureDeviceInput(device: device)}catch {debugPrint(error)return}//2.設置輸出let output = AVCaptureMetadataOutput()//2.1 設置結果處理的代理output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)//3.創建會話session = AVCaptureSession()if session!.canAddInput(input!) && session!.canAddOutput(output) {session!.addInput(input!)session!.addOutput(output)}else{return}//3.1 設置二維碼可以識別的碼制output.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]let bounds = UIScreen.main.boundslet x: CGFloat = scanBackVIew.frame.origin.x / bounds.size.widthlet y: CGFloat = scanBackVIew.frame.origin.y / bounds.size.heightlet width: CGFloat = scanBackVIew.frame.size.width / bounds.size.widthlet height: CGFloat = scanBackVIew.frame.size.height / bounds.size.heightoutput.rectOfInterest = CGRect(x: y, y: x, width: height, height: width)let layer = AVCaptureVideoPreviewLayer(session: session!)layer.frame = UIScreen.main.boundsview.layer.insertSublayer(layer, at: 0)//4.啟動會話讓輸入開始菜單數據 輸出對象 開始處理數據session!.startRunning()self.layer = layer}override func viewDidAppear(_ animated: Bool) {super.viewDidAppear(animated)toBottom.constant = scanBackVIew.frame.size.heightview.layoutIfNeeded()toBottom.constant = -scanBackVIew.frame.size.heightUIView.animate(withDuration: 2) {UIView.setAnimationRepeatCount(MAXFLOAT)self.view.layoutIfNeeded()}}override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {startScan()}func removeScanAnim(){chongjiBoView.layer.removeAllAnimations()}}extension ScanQRCodeVC : AVCaptureMetadataOutputObjectsDelegate{func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection){ // debugPrint("set")debugPrint(metadataObjects)for obj in metadataObjects {if obj.isKind(of: AVMetadataMachineReadableCodeObject.self) {let resultObj = self.layer?.transformedMetadataObject(for: obj)let qrCodeObj = resultObj as! AVMetadataMachineReadableCodeObjectdebugPrint(qrCodeObj.stringValue!)debugPrint(qrCodeObj.corners) // qrCodeObj.corners 代表二維碼4個角 但是// drawFrame(qrCodeObj: qrCodeObj)}}}func drawFrame(qrCodeObj: AVMetadataMachineReadableCodeObject) -> Void {let corners = qrCodeObj.corners//1.借助一個圖形層let shapLayer = CAShapeLayer()let path = UIBezierPath()var index = 0;for corner in corners {let pointDic = corner as! CFDictionaryvar point = CGPoint.zero // CGPointMakeWithDictionaryRepresentation(pointDic, &point) // point = CGPoint.init(dictionaryRepresentation: pointDic)!point = CGPoint.init(dictionaryRepresentation: pointDic)!if index==0 {path.move(to: point)}else {path.addLine(to: point)}index += 1}shapLayer.path = path.cgPathlayer?.addSublayer(shapLayer)} }

git地址
https://gitee.com/johnson__save_admin/qrcode-swift

總結

以上是生活随笔為你收集整理的Swift5以及IOS15对于二维码的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。