美文网首页
绘制二维码图片

绘制二维码图片

作者: 独孤流 | 来源:发表于2018-12-01 13:29 被阅读29次

日常使用的功能中有文本生产二维码图片
在二维码图片上添加说明文字及logo等
在图片上添加水印

使用场景:


屏幕快照 2018-12-01 下午1.23.49.png

具体实现:写一个NSString的分类

NSString+QRCode.h

#import <Foundation/Foundation.h>

@interface NSString (QRCode)
/**
 生成二维码图片

 @return 生产的图片
 */
- (UIImage *)createQRCodeImage;

/**
 生成带logo图片的二维码图片

 @param logo 二维码图片
 @return 生成的图片
 */
- (UIImage *)createQRCodeImageWithLogo:(UIImage *)logo;
/**
 给二维码图片添加空白边框及说明文字

 @param text 说明文字
 @param font 说明文字字体
 @param edge 空白边框
 @return 生产的图片
 */
- (UIImage *)createQRCodeImageWithText:(NSString *)text font:(UIFont *)font border:(UIEdgeInsets)edge;
- (UIImage *)createQRCodeImageWithText:(NSString *)text font:(UIFont *)font border:(UIEdgeInsets)edge logo:(UIImage *)logo;
@end

NSString+QRCode.m

//
//  NSString+QRCode.m
#import <UIKit/UIKit.h>
#import "NSString+QRCode.h"


@implementation NSString (QRCode)
#pragma mark - 二维码图片相关
- (UIImage *)createQRCodeImageWithText:(NSString *)text font:(UIFont *)font border:(UIEdgeInsets)edge
{
    return [self createQRCodeImageWithText:text font:font border:edge logo:nil];
}
- (UIImage *)createQRCodeImageWithText:(NSString *)text font:(UIFont *)font border:(UIEdgeInsets)edge logo:(UIImage *)logo
{
    UIImage *image = [self createQRCodeImageWithLogo:logo];
    CGSize size= CGSizeMake(image.size.width+edge.left+edge.right, image.size.height+edge.top+edge.bottom);//画布大小
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
    
    
    //获得一个位图图形上下文
    CGContextRef context=UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height));//填充颜色
    
    [image drawAtPoint:CGPointMake(edge.top, edge.left)];
    
    
    if(font == nil){
        font = [UIFont systemFontOfSize:12];
    }
    CGFloat textWidth = [text boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, 20)
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                        attributes:@{ NSFontAttributeName :font }
                                           context:nil].size.width;
    [text drawAtPoint:CGPointMake((size.width-textWidth)/2, image.size.height+edge.top+5) withAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:[UIColor blackColor]}];
    
    UIImage *newImage=UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return  newImage;
}
- (UIImage *)createQRCodeImage:(UIImage *)image andLogo:(UIImage *)logo
{
    if (logo == nil) {
        return image;
    }
    CGSize size= image.size;//画布大小
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
    
    
    //获得一个位图图形上下文
    CGContextRef context=UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height));//填充颜色
    
    [image drawAtPoint:CGPointMake(0, 0)];
    
    CGFloat logoWith = logo.size.width;
    CGFloat logoHeight = logo.size.height;
    if (logoWith<150) {
        CGFloat logoScale = 150/logoWith;
        logoWith = logoWith*logoScale;
        logoHeight = logoHeight*logoScale;
    }
    [logo drawInRect:CGRectMake((size.width-logoWith)/2, (size.height-logoHeight)/2, logoWith, logoHeight)];
    
    
    UIImage *newImage=UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return  newImage;
}
- (UIImage *)createQRCodeImage
{
    return [self createQRCodeImageWithLogo:nil];
}
- (UIImage *)createQRCodeImageWithLogo:(UIImage *)logo
{
    CIImage *ciImage = [self createCIQRCodeImage];
    UIImage *image = [self createNonInterpolatedUIImageFormCIImage:ciImage withSize:512];
    return [self createQRCodeImage:image andLogo:logo];
}
/**
 生成二维码图片
 
 @return
 */
- (CIImage *)createCIQRCodeImage
{
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    [filter setDefaults];
    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
    [filter setValue:data forKey:@"inputMessage"];              //通过kvo方式给一个字符串,生成二维码
    [filter setValue:@"H" forKey:@"inputCorrectionLevel"];      //设置二维码的纠错水平,越高纠错水平越高,可以污损的范围越大
    
    //设置背景颜色和填充颜色 默认白色背景黑色填充
    UIColor *backgroundColor = [UIColor whiteColor];
    UIColor *fillColor = [UIColor blackColor];
    CIColor *color1 = [CIColor colorWithCGColor:fillColor.CGColor];
    CIColor *color2 = [CIColor colorWithCGColor:backgroundColor.CGColor];
    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys: filter.outputImage ,@"inputImage",
                                color1,@"inputColor0",
                                color2,@"inputColor1",nil];
    CIFilter *newFilter = [CIFilter filterWithName:@"CIFalseColor" withInputParameters:parameters];
    CIImage *outPutImage = [newFilter outputImage];
    return outPutImage;
}
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
    CGRect extent = CGRectIntegral(image.extent);
    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
    
    // 1.创建bitmap;
    size_t width = CGRectGetWidth(extent) * scale;
    size_t height = CGRectGetHeight(extent) * scale;
    //创建一个DeviceRGB颜色空间
    CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();
    //CGBitmapContextCreate(void * _Nullable data, size_t width, size_t height, size_t bitsPerComponent, size_t bytesPerRow, CGColorSpaceRef  _Nullable space, uint32_t bitmapInfo)
    //width:图片宽度像素
    //height:图片高度像素
    //bitsPerComponent:每个颜色的比特值,例如在rgba-32模式下为8
    //bitmapInfo:指定的位图应该包含一个alpha通道。
    
    CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaPremultipliedLast);
    CIContext *context = [CIContext contextWithOptions:nil];
    //创建CoreGraphics image
    CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
    
    CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
    CGContextScaleCTM(bitmapRef, scale, scale);
    CGContextDrawImage(bitmapRef, extent, bitmapImage);
    
    // 2.保存bitmap到图片
    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
    CGContextRelease(bitmapRef); CGImageRelease(bitmapImage);
    
    //原图
    UIImage *outputImage = [UIImage imageWithCGImage:scaledImage];
    return outputImage;
}

@end

相关文章

网友评论

      本文标题:绘制二维码图片

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