【iOS】生成二维码

  • 直接上干货
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface QRCodeGenerator : NSObject
+(instancetype)shareInstance;


- (UIImage *)creatQRGeneratorWithCenterImage:(UIImage *)centerImage textStr:(NSString*)str;

@end

NS_ASSUME_NONNULL_END
#import "QRCodeGenerator.h"
static QRCodeGenerator * _instance;
@implementation QRCodeGenerator

+ (instancetype)shareInstance{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
        _instance = [[self alloc] init];
    });
    return _instance;
}


- (UIImage *)creatQRGeneratorWithCenterImage:(UIImage *)centerImage textStr:(NSString*)str{
    /// 1.创建二维码过滤器
    CIFilter * qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    /// 2.设置默认值
    [qrFilter setDefaults];
    
    [qrFilter setValue:[str dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
    // 4.获取二维码的图片
    CIImage *ciimage = qrFilter.outputImage;
    // 放大图片的比例
//    ciimage = [ciimage imageByApplyingTransform:CGAffineTransformMakeScale(9, 9)];
    /// 返回image
    
    UIImage *newImage = [self createNonInterpolatedUIImageFormCIImage:ciimage withSize:300];
//    return [UIImage imageWithCIImage:ciimage] ;
    return [self qrGeneratorAddCenterImage:centerImage originalImage:newImage];
}


//--生成高清二维码
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
    CGRect extent = CGRectIntegral(image.extent);
    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
    // 创建 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:image fromRect:extent];
        CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
        CGContextScaleCTM(bitmapRef, scale, scale);
    CGContextDrawImage(bitmapRef, extent, bitmapImage);
     // 保存 bitmap 到图片
     CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
     CGContextRelease(bitmapRef);
     CGImageRelease(bitmapImage);
     return [UIImage imageWithCGImage:scaledImage];
}


-(UIImage *)qrGeneratorAddCenterImage:(UIImage *)image originalImage:(UIImage *)originalImage{
    /// 开启图形上下文
    UIGraphicsBeginImageContext(originalImage.size);
    /// 画二维码的图片
    [originalImage drawInRect:CGRectMake(0, 0, originalImage.size.width, originalImage.size.height)];
    
    CGFloat meImageW = 50;
    CGFloat meImageH = 50;
    CGFloat meImageX = (originalImage.size.width - meImageW) * 0.5;
    CGFloat meImageY = (originalImage.size.height - meImageH) * 0.5;
    
    /// 画中心图片
    [image drawInRect:CGRectMake(meImageX, meImageY, meImageW, meImageH)];
    
    /// 获取图片
    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
    /// 关闭图形上下文
    UIGraphicsEndImageContext();
    
    return finalImage;
    
    
    
    
    
    
}

  • 这是生成中间带图片的

请大家关注我的个人公众号
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值