二维码的生成与扫描

//生成二维码

    //创建imageView来显示二维码
    UIImageView *imgView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 250, 250)];
    imgView.center = self.view.center;
    [self.view addSubview:imgView];
    
    //图标的生成
    UIImage *log = [UIImage imageNamed:@"JL"];
    
    //二维码的生成
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    [filter setDefaults];
    NSString *input = @"https://www.baidu.com";
    NSData *inputData = [input dataUsingEncoding:NSUTF8StringEncoding];
    
    [filter setValue:inputData forKey:@"inputMessage"];
    
    //获得滤镜输出的二维码
    CIImage *ciImg = filter.outputImage;
    
    ciImg = [ciImg imageByApplyingTransform:CGAffineTransformMakeScale(10, 10)];
    
    UIImage *img = [UIImage imageWithCIImage:ciImg];
    //开启图片上下文
    UIGraphicsBeginImageContext(imgView.frame.size);
    //绘制图片
    [img drawInRect:CGRectMake(0, 0, imgView.frame.size.width, imgView.frame.size.height)];
    
    CGFloat logX = (imgView.frame.size.width - log.size.width)/2;
    CGFloat logY = (imgView.frame.size.height - log.size.height)/2;
    [log drawInRect:CGRectMake(logX, logY, log.size.width, log.size.height)];
    //获取图片
    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
    //关闭上下文
    UIGraphicsEndImageContext();
    
    imgView.image = finalImage;

//扫描二维码
@interface ScaleViewController ()

@property (nonatomic, strong) UIView *scanRectView;

@property (strong, nonatomic) AVCaptureDevice  *device;
@property (strong, nonatomic) AVCaptureDeviceInput  *input;
@property (strong, nonatomic) AVCaptureMetadataOutput  *output;
@property (strong, nonatomic) AVCaptureSession  *session;
@property (strong, nonatomic) AVCaptureVideoPreviewLayer *preview;
@end

@implementation ScaleViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    

    self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];

    self.output = [[AVCaptureMetadataOutput alloc]init];
    [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

    self.session = [[AVCaptureSession alloc]init];
    [self.session setSessionPreset:([UIScreen mainScreen].bounds.size.height<500)?AVCaptureSessionPreset640x480:AVCaptureSessionPresetHigh];
    [self.session addInput:self.input];
    [self.session addOutput:self.output];
    self.output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode];
    CGSize windowSize = [UIScreen mainScreen].bounds.size;
    
    CGSize scanSize = CGSizeMake(windowSize.width*3/4, windowSize.width*3/4);
    CGRect scanRect = CGRectMake((windowSize.width-scanSize.width)/2, (windowSize.height-scanSize.height)/2, scanSize.width, scanSize.height);
    
    //计算rectOfInterest 注意x,y交换位置
    scanRect = CGRectMake(scanRect.origin.y/windowSize.height, scanRect.origin.x/windowSize.width, scanRect.size.height/windowSize.height,scanRect.size.width/windowSize.width);
    
    self.scanRectView = [UIView new];
    [self.view addSubview:self.scanRectView];
    self.scanRectView.frame = CGRectMake(0, 0, scanSize.width, scanSize.height);
    self.scanRectView.center = CGPointMake(CGRectGetMidX([UIScreen mainScreen].bounds), CGRectGetMidY([UIScreen mainScreen].bounds));
    self.scanRectView.layer.borderColor = [UIColor redColor].CGColor;
    self.scanRectView.layer.borderWidth = 1;
    
    self.output.rectOfInterest = scanRect;

    self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
    self.preview.frame = [UIScreen mainScreen].bounds;
    [self.view.layer insertSublayer:self.preview atIndex:0];

//开始捕获
[self.session startRunning];

}

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    if ( (metadataObjects.count==0) )
    {
        return;
    }
    
    if (metadataObjects.count>0) {
        
        [self.session stopRunning];
        
        AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject;
        //输出扫描字符串
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:metadataObject.stringValue message:@"" delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil];
        
        [alert show];
    }
}





    ```

你可能感兴趣的:(二维码的生成与扫描)