iOS实现二维码的生成及中间小图标添加

首先看二维码生成 

首先引入框架

#import <CoreImage/CoreImage.h>

代码

// 1.实例化二维码滤镜

    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

    

    // 2.恢复滤镜的默认属性 (因为滤镜有可能保存上一次的属性)

    [filter setDefaults];

扫描二维码关注公众号,回复: 994642 查看本文章

    

    // 3.将字符串转换成NSdata

    NSData *data  = [@"http://www.baidu.com" dataUsingEncoding:NSUTF8StringEncoding];

    // 4.通过KVO设置滤镜, 传入data, 将来滤镜就知道要通过传入的数据生成二维码

    [filter setValue:data forKey:@"inputMessage"];

    // 5.生成二维码

    CIImage *outputImage = [filter outputImage];

   // UIImage *image = [UIImage  imageWithCIImage:outputImage]; 这种生成的图片会模糊 下面对图片进行处理

   //处理后代码为这样 得到最后的图片 

    UIImage *image = [self createNonInterpolatedUIImageFormCIImage:outputImage withSize:200];

    self.codeImageV.image = finalImg;



// 对图片进行处理

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

    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 [UIImage imageWithCGImage:scaledImage];

}

如果需要在里面添加一个小logo,代码如下 下面的代码跟上面没关系 是独立的 只是下面这个中间加了个logo

// 1.实例化二维码滤镜

    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

    

    // 2.恢复滤镜的默认属性 (因为滤镜有可能保存上一次的属性)

    [filter setDefaults];

    

    // 3.将字符串转换成NSdata

    NSData *data  = [@"http://www.baidu.com" dataUsingEncoding:NSUTF8StringEncoding];

    // 4.通过KVO设置滤镜, 传入data, 将来滤镜就知道要通过传入的数据生成二维码

    [filter setValue:data forKey:@"inputMessage"];

    // 5.生成二维码

    CIImage *outputImage = [filter outputImage];

    

    CGAffineTransform scale=CGAffineTransformMakeScale(10, 10);

    outputImage=[outputImage imageByApplyingTransform:scale];

    //6.在中心增加一张图片

    UIImage *img=[UIImage imageWithCIImage:outputImage];

    //7.1开启图形上下文

    UIGraphicsBeginImageContext(img.size);

     //7.2将二维码的图片画入

    [img drawInRect:CGRectMake(0, 0, img.size.width, img.size.height)];

    //7.3在中心划入其他图片 

     UIImage *centerImg=[UIImage imageNamed:@"logo"];

    CGFloat centerW=70;

    CGFloat centerH=70;

    CGFloat centerX=(img.size.width-70)*0.5;

    CGFloat centerY=(img.size.height -70)*0.5;

    

    [centerImg drawInRect:CGRectMake(centerX, centerY, centerW, centerH)];

    //7.4获取绘制好的图片

    UIImage *finalImg=UIGraphicsGetImageFromCurrentImageContext();

    //7.5关闭图像上下文

    UIGraphicsEndImageContext();

    

//    UIImage *image = [UIImage  imageWithCIImage:outputImage];

//    UIImage *image = [self createNonInterpolatedUIImageFormCIImage:outputImage withSize:200];


    self.codeImageV = [UIImageView new];

    [self.view addSubview:_codeImageV];

    [_codeImageV mas_makeConstraints:^(MASConstraintMaker *make) {

        make.centerX.mas_equalTo(self.view.mas_centerX);

        make.centerY.mas_equalTo(self.view.mas_centerY).offset(-50);

        make.width.height.mas_equalTo(200);

    }];

    self.codeImageV.image = finalImg;



猜你喜欢

转载自blog.csdn.net/xiaoqi307/article/details/80368185