二维码生成与扫描

一、生成二维码

新建一个UIImage的类别

.h里添加一个类方法

/**

 *  生成二维码

 *

 *  @param qrString 待转换成二维码的字符串

 *  @param size     二维码宽高

 *

 *  @return 返回二维码图片

 */

+ (UIImage *)creatCIQRCodeImage:(NSString *)qrString withSize:(CGFloat)size;




.m里面实现

/**

 *  生成二维码

 */

+ (UIImage *)creatCIQRCodeImage:(NSString *)qrString withSize:(CGFloat)size

{

    // 1.创建过滤器,这里的@"CIQRCodeGenerator"是固定的

    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

    

    // 2.恢复默认设置

    [filter setDefaults];

    

    // 3. 给过滤器添加数据

    NSString *dataString = qrString;

    NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];

    // 注意,这里的value必须是NSData类型

    [filter setValue:data forKeyPath:@"inputMessage"];

    

    // 4. 生成二维码

    CIImage *outputImage = [filter outputImage];

    

    // 5. 生成高清二维码

    CGRect extent = CGRectIntegral(outputImage.extent);

    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));

    

    // 6. 创建bitmap

    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:outputImage fromRect:extent];

    CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);

    CGContextScaleCTM(bitmapRef, scale, scale);

    CGContextDrawImage(bitmapRef, extent, bitmapImage);

    

    // 7.保存bitmap图片

    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);

    CGContextRelease(bitmapRef);

    CGImageRelease(bitmapImage);

    return [UIImage imageWithCGImage:scaledImage];

}


二、扫描二维码


1.导入头文件

#import <AVFoundation/AVFoundation.h>

2.添加代理

<AVCaptureMetadataOutputObjectsDelegate>


3.添加两个属性

/** 捕捉会话 */

@property (nonatomic, weak) AVCaptureSession *session;

/** 预览图层 */

@property (nonatomic, weak) AVCaptureVideoPreviewLayer *layer;


/**

 *  扫描二维码

 */

- (void)scanCIQRCode

{

    // 1. 创建捕捉会话

    AVCaptureSession *session = [[AVCaptureSession alloc] init];

    self.session = session;

    

    // 2. 添加输入设备(数据从摄像头输入)

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];

    [session addInput:input];

    

    // 3. 添加输出数据接口

    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];

    // 设置输出接口代理

    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

    [session addOutput:output];

    // 3.1 设置输入元数据的类型(类型是二维码数据)

    // 注意,这里必须设置在addOutput后面,否则会报错

    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

    

    // 4.添加扫描图层

    AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:session];

    layer.frame = self.view.frame;

    [self.view.layer addSublayer:layer];

    self.layer = layer;

    

    // 5. 开始扫描

    [session startRunning];

}


#pragma mark - <AVCaptureMetadataOutputObjectsDelegate>


- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

{

    if (metadataObjects.count) {// 扫描到了数据

        AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];


NSLog(@"扫描到的数据=%@",object);

        // 停止扫描

        [self.session stopRunning];

        

        // 将预览图层移除

        [self.layer removeFromSuperlayer];

    }else{

        NSLog(@"没有扫描到数据");

    }

}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
经验证,可于EXCEL的VBA中使用的二维码QRMAKER)控件 、VBA中调用QRmaker 由于VBA的窗体环境和VB中的差不多,所以在VBA窗体中调用QRmaker就不再描述,这里主要说明一下如何在表格中引用QRmaker。 第一步:单击Office按钮,在Excel选项中开启“开发工具”项,从而让“开发工具”选项卡显示出来。 第二步,插入→其他控件,选择QRmaker。 然后就是在合适的地方绘出QRmaker控件,这时会自动进入“设计模式”,单击“属性”可以展开控件的“属性”栏,可根据需要设置相关属性,和VB中的操作雷同。 接下来与VB中不一样的地方就是如何在VBA代码中引用QRmaker控件了,这点和VB中有点小区别。 添加“模块”,添加“过程”,输入代码。 Public Sub QRCodeTest() '定义QRString变量,存储要生成二维码的字符串 Dim QRString As String '给QRString赋值,根据实际情况赋值 QRString = Sheet1.Range("E14") & Sheet1.Range("F14") & ";" & Sheet1.Range("E15") & Sheet1.Range("F15") & ";" & Sheet1.Range("E16") & Sheet1.Range("F16") & "_" & Sheet1.Range("G16") & "_" & Sheet1.Range("F17") & "_" & Sheet1.Range("G17") Sheet1.Select '设置QRmaker的AutoRedraw属性为ArOn Sheet1.QRmaker1.AutoRedraw = ArOn '将字符串传递给QRmaker控件 Sheet1.QRmaker1.InputData = QRString '刷新QRmaker的内容,如果AutoRedraw属性为On,则无需此句 'Sheet1.QRmaker1.Refresh End Sub 然后就可以在Excel表格中生成二维码了,根据实际情况,在填写相关数据后,执行上面的语句就可以了,其他的工作该咋的就咋的吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haiooh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值