美文网首页
IOS 生成二维码功能

IOS 生成二维码功能

作者: 阳光下的灰尘 | 来源:发表于2021-12-08 14:37 被阅读0次
/**
 *  直接生成带logo的二维码
 *
 *  @param data 二维码 data
 *  @param size    宽或高
 *  @param logo    logo图片
 *
 *  @return 返回二维码图片
 */
+ (UIImage *)generateQRCodeData:(NSData *)data
                           size:(CGFloat)size
                           logo:(UIImage *)logo {
    // 创建filter
    CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    // 设置内容和纠错级别
    [qrFilter setValue:data forKey:@"inputMessage"];
    /**
     inputCorrectionLevel
     等级  容错率  容错率越低,二维码看着越简单
     L     7%
     M     15%  默认值
     Q     25%
     H     30%
     */
    [qrFilter setValue:@"L" forKey:@"inputCorrectionLevel"];

    
    CGRect extent = CGRectIntegral(qrFilter.outputImage.extent);
    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
    
    // 创建bitmap;
    size_t width1 = CGRectGetWidth(extent) * scale;
    size_t height1 = CGRectGetHeight(extent) * scale;
    CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
    CGContextRef bitmapRef = CGBitmapContextCreate(nil, width1, height1, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef bitmapImage = [context createCGImage:qrFilter.outputImage fromRect:extent];
    CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
    CGContextScaleCTM(bitmapRef, scale, scale);
    CGContextDrawImage(bitmapRef, extent, bitmapImage);
    
    // 保存bitmap到图片
    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
    CGContextRelease(bitmapRef);
    CGImageRelease(bitmapImage);
    
    //  将logo绘制到二维码上面
    CGImageRef midImage = [UIImage imageWithCGImage:scaledImage].CGImage;
  
    UIImage *qrImage = [UIImage imageWithCGImage:midImage];
    
    CGFloat pading = 0;
    if (logo) {
        CGFloat qrSize = qrImage.size.width;
        //UIGraphicsBeginImageContext(qrImage.size);
        UIGraphicsBeginImageContextWithOptions(qrImage.size, NO, [UIScreen mainScreen].scale);
        [qrImage drawInRect:(CGRectMake(0, 0, qrImage.size.width, qrImage.size.height))];
        CGFloat x = qrSize/2 - logo.size.width/2;
        CGFloat y = qrSize/2 - logo.size.height/2;
        [logo drawInRect:(CGRectMake(x, y, logo.size.width, logo.size.height))];
        UIImage *img2=UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        UIGraphicsBeginImageContextWithOptions(img2.size, NO, [UIScreen mainScreen].scale);
#pragma mark 特殊处理, 尽量使内填充为0
        CGRect rect1 = CGRectMake(-pading, -pading, size+pading*2, size+pading*2);
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextTranslateCTM(ctx, rect1.origin.x, rect1.origin.y);
        CGContextTranslateCTM(ctx, 0, rect1.size.height);
        CGContextScaleCTM(ctx, 1.0, -1.0);
        CGContextTranslateCTM(ctx, -rect1.origin.x, -rect1.origin.y);
        CGContextDrawImage(ctx, rect1, img2.CGImage);
        UIImage *QRImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return QRImage;
    }
    else {
        return qrImage;
    }
}

相关文章

  • iOS 二维码

    1、二维码的生成 CoreImage 生成从iOS7开始集成了二维码的生成和读取功能此前被广泛使用的zbarsdk...

  • 实用技术第1篇——如何生成和读取二维码【上】

    前言 苹果官方从iOS7开始集成了二维码的生成和读取功能,本文简单介绍下如何生成和读取二维码。 如何生成二维码 步...

  • 【iOS】二维码生成及定制

    【iOS】二维码生成及定制 【iOS】二维码生成及定制

  • iOS开发:二维码扫描与生成(扫描篇)

    iOS开发中经常要用到生成二维码与扫描二维码的功能,iOS7开始,系统支持原生的扫描二维码,iOS7 扫描二维码可...

  • iOS 花式二维码生成和二维码识别

    iOS 花式二维码生成和二维码识别 iOS 花式二维码生成和二维码识别

  • iOS 图片转换二维码

    二维码 1.ios7开始集成了二维码的生成和读取功能 2.生成二维码的步骤 3.二维码的内容:「纯文本」 「名片」...

  • IOS中生成二维码、扫描二维码

    title : IOS中生成二维码、扫描二维码category : UI IOS中生成二维码、保存二维码 标签(空...

  • 简单二维码的生成

    1.iOS7以后,开始集成了二维码的生成和读取功能2.生成二维码的步骤:导入CoreImage框架通过滤镜CIFi...

  • 二维码

    二维码的生成: 1.iOS7开始集成了二维码的生成和读取功能。 (在以前被广泛使用的是zbarsdk,目前不支持6...

  • 二维码

    二维码的生成 从iOS7开始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk目前不支持64位处理器 生...

网友评论

      本文标题:IOS 生成二维码功能

      本文链接:https://www.haomeiwen.com/subject/npdtfrtx.html