加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Mac开发生成二维码

(2022-03-28 17:41:27)
注:需导入 CoreImage库

- (void)testQRCodeImage {

    NSImage *imgLogo = [NSImage imageNamed:@"avatar"];

    NSImage *imgQRCode = [self createQRCodeWithTargetString:@"https://www.baidu.com"

                                                  logoImage:imgLogo imageSize:NSMakeSize(200, 200)];

    self.imgView.image = imgQRCode;

}


- (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)];

}


效果:


 

Mac开发生成二维码



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有