You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
3.4 KiB
72 lines
3.4 KiB
1 year ago
|
//
|
||
|
// SGGenerateQRCode.m
|
||
|
// SGQRCodeExample
|
||
|
//
|
||
|
// Created by kingsic on 2021/7/5.
|
||
|
// Copyright © 2021 kingsic. All rights reserved.
|
||
|
//
|
||
|
|
||
|
#import "SGGenerateQRCode.h"
|
||
|
|
||
|
@implementation SGGenerateQRCode
|
||
|
|
||
|
+ (UIImage *)generateQRCodeWithData:(NSString *)data size:(CGFloat)size {
|
||
|
return [self generateQRCodeWithData:data size:size color:[UIColor blackColor] backgroundColor:[UIColor whiteColor]];
|
||
|
}
|
||
|
|
||
|
+ (UIImage *)generateQRCodeWithData:(NSString *)data size:(CGFloat)size color:(UIColor *)color backgroundColor:(UIColor *)backgroundColor {
|
||
|
NSData *string_data = [data dataUsingEncoding:NSUTF8StringEncoding];
|
||
|
// 1、二维码滤镜
|
||
|
CIFilter *fileter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
|
||
|
[fileter setValue:string_data forKey:@"inputMessage"];
|
||
|
[fileter setValue:@"H" forKey:@"inputCorrectionLevel"];
|
||
|
CIImage *ciImage = fileter.outputImage;
|
||
|
// 2、颜色滤镜
|
||
|
CIFilter *color_filter = [CIFilter filterWithName:@"CIFalseColor"];
|
||
|
[color_filter setValue:ciImage forKey:@"inputImage"];
|
||
|
[color_filter setValue:[CIColor colorWithCGColor:color.CGColor] forKey:@"inputColor0"];
|
||
|
[color_filter setValue:[CIColor colorWithCGColor:backgroundColor.CGColor] forKey:@"inputColor1"];
|
||
|
// 3、生成处理
|
||
|
CIImage *outImage = color_filter.outputImage;
|
||
|
CGFloat scale = size / outImage.extent.size.width;
|
||
|
outImage = [outImage imageByApplyingTransform:CGAffineTransformMakeScale(scale, scale)];
|
||
|
return [UIImage imageWithCIImage:outImage];
|
||
|
}
|
||
|
|
||
|
+ (UIImage *)generateQRCodeWithData:(NSString *)data size:(CGFloat)size logoImage:(UIImage *)logoImage ratio:(CGFloat)ratio {
|
||
|
return [self generateQRCodeWithData:data size:size logoImage:logoImage ratio:ratio logoImageCornerRadius:5 logoImageBorderWidth:5 logoImageBorderColor:[UIColor whiteColor]];
|
||
|
}
|
||
|
|
||
|
+ (UIImage *)generateQRCodeWithData:(NSString *)data size:(CGFloat)size logoImage:(UIImage *)logoImage ratio:(CGFloat)ratio logoImageCornerRadius:(CGFloat)logoImageCornerRadius logoImageBorderWidth:(CGFloat)logoImageBorderWidth logoImageBorderColor:(UIColor *)logoImageBorderColor {
|
||
|
UIImage *image = [self generateQRCodeWithData:data size:size color:[UIColor blackColor] backgroundColor:[UIColor whiteColor]];
|
||
|
if (logoImage == nil) return image;
|
||
|
if (ratio < 0.0 || ratio > 0.5) {
|
||
|
ratio = 0.25;
|
||
|
}
|
||
|
CGFloat logoImageW = ratio * size;
|
||
|
CGFloat logoImageH = logoImageW;
|
||
|
CGFloat logoImageX = 0.5 * (image.size.width - logoImageW);
|
||
|
CGFloat logoImageY = 0.5 * (image.size.height - logoImageH);
|
||
|
CGRect logoImageRect = CGRectMake(logoImageX, logoImageY, logoImageW, logoImageH);
|
||
|
// 绘制logo
|
||
|
UIGraphicsBeginImageContextWithOptions(image.size, false, [UIScreen mainScreen].scale);
|
||
|
[image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
|
||
|
if (logoImageCornerRadius < 0.0 || logoImageCornerRadius > 10) {
|
||
|
logoImageCornerRadius = 5;
|
||
|
}
|
||
|
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:logoImageRect cornerRadius:logoImageCornerRadius];
|
||
|
if (logoImageBorderWidth < 0.0 || logoImageBorderWidth > 10) {
|
||
|
logoImageBorderWidth = 5;
|
||
|
}
|
||
|
path.lineWidth = logoImageBorderWidth;
|
||
|
[logoImageBorderColor setStroke];
|
||
|
[path stroke];
|
||
|
[path addClip];
|
||
|
[logoImage drawInRect:logoImageRect];
|
||
|
UIImage *QRCodeImage = UIGraphicsGetImageFromCurrentImageContext();
|
||
|
UIGraphicsEndImageContext();
|
||
|
return QRCodeImage;
|
||
|
}
|
||
|
|
||
|
@end
|