• iOS 有关二维码


    一、把相应的URL生成二维码

    利用有关图像变成的框架 #import <CoreImage/CoreImage.h>

    步骤:实例化二维码滤镜---->恢复滤镜属性---->将字符串转化为data--->通过KVO设置滤镜---->滤镜将data生成二维码CIImage

        // 1.实例化二维码滤镜
        CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
        
        // 2.恢复滤镜的默认属性 (因为滤镜有可能保存上一次的属性)
        [filter setDefaults];
        
        // 3.将字符串转化为data
        NSData *data = [@"http://124.207.197.43:7080/OneBox/page/front/download.html" dataUsingEncoding:NSUTF8StringEncoding];
        
        // 4.通过KVO设置滤镜, 传入data, 将来滤镜就知道要通过传入的数据生成二维码
        [filter setValue:data forKey:@"inputMessage"];
        
        // 5.生成二维码
        CIImage *outputImage = [filter outputImage];
       
        // 6.生成二维码图片
        UIImage *image = [UIImage imageWithCIImage:outputImage];

    二、扫描二维码

    首先引入框架 #import <AVFoundation/AVFoundation.h>

    步骤:实例化拍摄设备对象--->设置输入设备--->设置元数据输出(实例化对象和设置代理)--->添加拍摄会话(实例化对象,添加输入设备,添加输出元数据,设置输出元数据类型)--->设置视频预览图层(设置frame并添加)--->启动会话即开始扫描--->在元数据代理中得到扫描后的数据(由于多次调用这个代理,所以要先停下,并移除图层)

    //
    //  ViewController.m
    //  14-扫描二维码
    //
    //  Created by apple on 14/11/11.
    //  Copyright (c) 2014年 heima. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <AVFoundation/AVFoundation.h>
    
    @interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>
    @property (nonatomic, strong) AVCaptureSession *session;
    @property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        
        // 1. 实例化拍摄设备
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        
        // 2. 设置输入设备
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
        
        // 3. 设置元数据输出
        // 3.1 实例化拍摄元数据输出
        AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
        // 3.3 设置输出数据代理
        [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
        
        // 4. 添加拍摄会话
        // 4.1 实例化拍摄会话
        AVCaptureSession *session = [[AVCaptureSession alloc] init];
        // 4.2 添加会话输入
        [session addInput:input];
        // 4.3 添加会话输出
        [session addOutput:output];
        // 4.3 设置输出数据类型,需要将元数据输出添加到会话后,才能指定元数据类型,否则会报错
        [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
        
        self.session = session;
        
        // 5. 视频预览图层
        // 5.1 实例化预览图层, 传递_session是为了告诉图层将来显示什么内容
        AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];
        
        preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
        preview.frame = self.view.bounds;
        // 5.2 将图层插入当前视图
        [self.view.layer insertSublayer:preview atIndex:100];
        
        self.previewLayer = preview;
        
        // 6. 启动会话
        [_session startRunning];
    
    }
    
    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
    {
        
        // 会频繁的扫描,调用代理方法
        // 1. 如果扫描完成,停止会话
        [self.session stopRunning];
        // 2. 删除预览图层
        [self.previewLayer removeFromSuperlayer];
        
        NSLog(@"%@", metadataObjects);
        
        // 3. 设置界面显示扫描结果
        if (metadataObjects.count > 0) {
            AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
            // 提示:如果需要对url或者名片等信息进行扫描,可以在此进行扩展!
    //        _label.text = obj.stringValue;
            NSLog(@"%@", obj.stringValue);
        }
    }
    
    
    @end

    也可以利用第三放已经写好的框架使用:《LBXScan》

    这个面已经设置好了集中二维码扫描格式,很方便,但是集成起来需要好好看看代码。 扫描后输出结果在下面的方法里面得到

    - (void)scanResultWithArray:(NSArray<LBXScanResult*>*)array
    {
        
        if (array.count < 1)
        {
            NSLog(@"无扫描结果");
            
            return;
        }
        
        //经测试,可以同时识别2个二维码,不能同时识别二维码和条形码
        for (LBXScanResult *result in array) {
            
            NSLog(@"scanResult:%@",result.strScanned);
        }
        
        LBXScanResult *scanResult = array[0];
        
        NSString*strResult = scanResult.strScanned;
        
        self.scanImage = scanResult.imgScanned;
        
        if (!strResult) {
            
            return;
        }
        
        //震动提醒
        [LBXScanWrapper systemVibrate];
        //声音提醒
        [LBXScanWrapper systemSound];
        
    }
  • 相关阅读:
    Centos常用快捷键
    ngnix笔记
    转载申明
    Linux 最小安装常用包
    update-alternatives关键解疑
    使用Java语言开发机器学习框架和参数服务器
    storm实践
    JVM线程状态,park, wait, sleep, interrupt, yeild 对比
    PHP版本解密openrtb中的价格
    Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/peaker-wu/p/5523795.html
Copyright © 2020-2023  润新知