CIFilter创建二维码

作者: 小黑丶 | 来源:发表于2016-06-29 13:19 被阅读178次

    创建一个ImageView展示二维码

        
        self.imgView=[[UIImageView alloc]initWithFrame:CGRectMake(100, 100, [UIScreen mainScreen].bounds.size.width/2.0, [UIScreen mainScreen].bounds.size.width/2.0)];
        
        [self.view addSubview:_imgView];
           
        
        _imgView.image= [self createQRCodeWithString:@"www.baidu.com"];
    
        _imgView.layer.shadowOffset=CGSizeMake(0, 0.5);//设置阴影的偏移量
    
        _imgView.layer.shadowRadius=1;//设置阴影的半径
    
        _imgView.layer.shadowColor=[UIColor blackColor].CGColor;//设置阴影的颜色为黑色
    
        _imgView.layer.shadowOpacity=1;
    
    
    - (UIImage *)createQRCodeWithString:(NSString *)qrString{
        //二维码滤镜
        
        CIFilter *filter=[CIFilter filterWithName:@"CIQRCodeGenerator"];
        
        //恢复滤镜的默认属性
        
        [filter setDefaults];
        
        //将字符串转换成NSData
        
        NSData *data=[qrString dataUsingEncoding:NSUTF8StringEncoding];
        
        //通过KVO设置滤镜inputmessage数据
        
        [filter setValue:data forKey:@"inputMessage"];
        // 设置质量
        [filter setValue:@"Q" forKey:@"inputCorrectionLevel"];
        //获得滤镜输出的图像
        
        CIImage *outputImage=[filter outputImage];
        
        UIImage *image = [self createNonInterpolatedUIImageFormCIImage:outputImage withSize:100.0];
        
        return image;
    }
    
    - (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
        
        CGRect extent = CGRectIntegral(image.extent);
        
        CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
        
        // 创建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);
        
        // 保存bitmap到图片
        
        CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
        
        CGContextRelease(bitmapRef);
        
        CGImageRelease(bitmapImage);
        
        return [UIImage imageWithCGImage:scaledImage];
        
    }
    
    Paste_Image.png

    Swift版

    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            view.backgroundColor = UIColor.whiteColor()
            
            view.addSubview(imageView)
            imageView.frame = CGRect(x: 50, y: 100, width: 200, height: 200);
            imageView.image = createQRImage("www.baodd.com")
            
            
            imageView.layer.shadowOffset=CGSizeMake(0, 0.5);//设置阴影的偏移量
            
            imageView.layer.shadowRadius=1;//设置阴影的半径
            
            imageView.layer.shadowColor = UIColor.blackColor().CGColor;//设置阴影的颜色为黑色
            
            imageView.layer.shadowOpacity=1;
        }
    
      
        private func createQRImage(qrString:String) -> UIImage{
        
            let filter = CIFilter(name: "CIQRCodeGenerator")
            
            filter?.setDefaults()
            
            let stringData = qrString.dataUsingEncoding(NSUTF8StringEncoding)
            
            filter?.setValue(stringData, forKey: "inputMessage")
            filter?.setValue("Q", forKey: "inputCorrectionLevel")
            
            let outPutImage = filter?.outputImage
            
            
            
            let qrImage = createNonInterpolatedUIImageFormCIImage(outPutImage!, size: 200)
            
            let iconImage = UIImage.init(named: "1111")
            
            let finalImage = creteImage(qrImage, iconImage: iconImage!)
            
            return finalImage
            
        }
        /**
         合成图片
         */
        private func creteImage(bgImage: UIImage, iconImage: UIImage) -> UIImage
        {
           
            UIGraphicsBeginImageContext(bgImage.size)
          
            bgImage.drawInRect(CGRect(origin: CGPointZero, size: bgImage.size))
            
            let width:CGFloat = 50
            let height:CGFloat = width
            let x = (bgImage.size.width - width) * 0.5
            let y = (bgImage.size.height - height) * 0.5
            iconImage.drawInRect(CGRect(x: x, y: y, width: width, height: height))
           
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            
            UIGraphicsEndImageContext()
        
            return newImage
        }
        
        /**
         根据CIImage生成指定大小的高清UIImage
         
         :param: image 指定CIImage
         :param: size    指定大小
         :returns: 生成好的图片
         */
        private func createNonInterpolatedUIImageFormCIImage(image: CIImage, size: CGFloat) -> UIImage {
            
            let extent: CGRect = CGRectIntegral(image.extent)
            let scale: CGFloat = min(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent))
            
            // 1.创建bitmap;
            let width = CGRectGetWidth(extent) * scale
            let height = CGRectGetHeight(extent) * scale
            let cs: CGColorSpaceRef = CGColorSpaceCreateDeviceGray()!
            let bitmapRef = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, cs, 0)!
            
            let context = CIContext(options: nil)
            let bitmapImage: CGImageRef = context.createCGImage(image, fromRect: extent)
            
            CGContextSetInterpolationQuality(bitmapRef,  CGInterpolationQuality.None)
            CGContextScaleCTM(bitmapRef, scale, scale);
            CGContextDrawImage(bitmapRef, extent, bitmapImage);
            
            // 2.保存bitmap到图片
            let scaledImage: CGImageRef = CGBitmapContextCreateImage(bitmapRef)!
            
            return UIImage(CGImage: scaledImage)
        }
        private lazy var imageView: UIImageView = {
        
            let imageView = UIImageView()
            imageView.backgroundColor = UIColor.orangeColor()
            return imageView
        }()
    
    
    Paste_Image.png

    相关文章

      网友评论

        本文标题:CIFilter创建二维码

        本文链接:https://www.haomeiwen.com/subject/cthxjttx.html