ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【iOS】生成二维码

2021-03-03 16:03:30  阅读:225  来源: 互联网

标签:originalImage iOS 生成 二维码 bitmapRef extent UIImage CGFloat size


  • 直接上干货
#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;
    
    
    
    
    
    
}

  • 这是生成中间带图片的

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

标签:originalImage,iOS,生成,二维码,bitmapRef,extent,UIImage,CGFloat,size
来源: https://blog.csdn.net/Emperor_huanzi/article/details/114319359

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有