绘制二维码图片
2018-12-01 本文已影响29人
独孤流
日常使用的功能中有文本生产二维码图片
在二维码图片上添加说明文字及logo等
在图片上添加水印
使用场景:

具体实现:写一个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