-
(NSImage *)createQRCodeWithTargetString:(NSString *)targetString
logoImage:(NSImage *)logoImage
imageSize:(NSSize)imgSize{
//
1.创建一个二维码滤镜实例
CIFilter *filter
=
[CIFilter filterWithName:@"CIQRCodeGenerator"];
[filter setDefaults];
// 2.给滤镜添加数据
NSString *targetStr
= targetString;
NSData *targetData
=
[targetStr dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
[filter setValue:targetData forKey:@"inputMessage"];
// 3.生成二维码
CIImage *image
=
[filter outputImage];
// 4.高清处理:
size 要大于等于视图显示的尺寸
NSImage *img =
[self createNonInterpolatedUIImageFromCIImage:image size:imgSize.width];
NSImage *finalImg
=
[[NSImage alloc] initWithSize:imgSize];
// 5.嵌入LOGO
// 开启图形上下文
[finalImg lockFocus];
// 将二维码的LOGO画入
[img drawInRect:CGRectMake(0, 0,
imgSize.width,
imgSize.height)];
// 将logo画入
NSImage *centerImg
= logoImage;
CGFloat centerW=img.size.width*0.25;
CGFloat centerH=centerW;
CGFloat centerX=(img.size.width-centerW)*0.5;
CGFloat centerY=(img.size.height -centerH)*0.5;
[centerImg drawInRect:CGRectMake(centerX,
centerY,
centerW,
centerH)];
// 关闭图像上下文
[finalImg unlockFocus];
// 6.生成最终二维码
return finalImg;
}
-
(NSImage *)createNonInterpolatedUIImageFromCIImage:(CIImage *)image
size:(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;
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);
//2.保存bitmap到图片
CGImageRef scaledImage
= CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [[NSImage alloc] initWithCGImage:scaledImage size:NSMakeSize(width,
height)];
}
效果: