iOS 模糊效果的使用

作者: 东方_未明 | 来源:发表于2016-04-07 12:58 被阅读603次

    1. CoreImage 中的模糊滤镜

    • a. coreImage是苹果用来简化图片处理的框架
    • b. CIImage, CIFilter与CIContext三者之间的联系(CoreImage中三个重要的类)
    • c. CIGaussianBlur(高斯模糊)中可以设置的参数
      高斯模糊效果:


      Simulator Screen Shot 2016年4月7日 下午12.51.48.png
      Simulator Screen Shot 2016年4月7日 下午12.52.23.png
    // 原始图片
        UIImage *image           = [UIImage imageNamed:@"12.jpg"];
        
        /*-----------------CoreImage部分--------------------*/
        
        // CIImage
        CIImage *ciImage         = [[CIImage alloc] initWithImage:image];
        
        // CIFilter(滤镜的名字, 不要写错 高斯模糊)
        CIFilter *blurFilter     = [CIFilter filterWithName:@"CIGaussianBlur"];
        
        // 将图片输入到滤镜中
        [blurFilter setValue:ciImage forKey:kCIInputImageKey];
        
        /**在传入图片进入滤镜后,可以更改滤镜的一些参数进行设置,比如模糊程度等*/
        NSLog(@"%@", [blurFilter attributes]); // 打印看一下有哪些参数可以设置及相关信息
        // inputRadius参数: 模糊的程度 默认为10, 范围为0-100, 接收的参数为NSNumber类型
        
        // 设置模糊的程度
        [blurFilter setValue:@(8) forKey:@"inputRadius"];
        
        // 将处理好的图片输出
        CIImage *outImage        = [blurFilter valueForKey:kCIOutputImageKey];
        
        // CIContext 上下文(参数nil->默认为CPU渲染, 如果想用GPU渲染来提高效率的话,则需要传参数)
        CIContext *context       = [CIContext contextWithOptions:nil];
        
        // 将处理好的图片创建出来 outImage原来的大小size
        CGImageRef outputCGImage = [context createCGImage:outImage
                                                 fromRect:[outImage extent]];
        
        UIImage *blurImage       = [UIImage imageWithCGImage:outputCGImage];
        
        // 释放CGImageRef
        CGImageRelease(outputCGImage);
        /*-------------------------------------------------*/
    
    
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 568)];
        imageView.center       = self.view.center;
        imageView.image        = blurImage;
        [self.view addSubview:imageView];
    

    从上面可以看出 Core Image为了做得比较灵活,Filter都是按字符串的名字去创建的,比如高斯模糊滤镜就是“CIGaussianBlur”,这里有一个官方列表可以参看。
    除了这里提到的多种Filter之外,Core Image还提供了CIDetector等类,可以支持人脸识别等,在OS X上Core Image也做了更多支持。

    2. 基于vImage的UIImage+ImageEffects的category 模糊效果

    • a.UIImage+ImageEffects是Accelerate框架中的内容
    • b.UIImage+ImageEffects的模糊效果非常美观
    • c.修改过的UIImage+ImageEffects可以对图片进行局模糊等非常多的效果

    Accelerate这个framework主要是用来做数字信号处理、图像处理相关的向量、矩阵运算的库。我们可以认为我们的图像都是由向量或者矩阵数据构成的,Accelerate里既然提供了高效的数学运算API,自然就能方便我们对图像做各种各样的处理。
    基于vImage我们可以根据图像的处理原理直接做模糊效果,或者使用现有的工具。UIImage+ImageEffects是个很好的图像处理库
    这里提供一个下载地址(一个老师进行的改进,里面有部分用法说明)

    3. GPUImage

    第三方图片处理的开源库的下载地址
    同样是做高斯模糊,用GPUImage可以这样:

    GPUImageGaussianBlurFilter * blurFilter = [[GPUImageGaussianBlurFilter alloc] init];
    blurFilter.blurRadiusInPixels = 2.0;
    UIImage * image = [UIImage imageNamed:@"xxx"];
    UIImage *blurredImage = [blurFilter imageByFilteringImage:image];
    

    4. iOS8 中 UIVisualEffectView 模糊效果

    • UIVisualEffectView的模糊效果是即时渲染的
    • 在UIVisualEffectView上面添加文本显示要做一些特殊的处理
    • 只有在iOS8以上才可以使用
      代码如下:
    // 原始图片
        UIImage *image = [UIImage imageNamed:@"12.jpg"];
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 568)];
        imageView.userInteractionEnabled = YES;
        imageView.center       = self.view.center;
        imageView.image        = image;
        [self.view addSubview:imageView];
        
        // 为了更好的看到UIVisualEffectView的即时渲染效果添加平移手势
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
        [imageView addGestureRecognizer:pan];
        
        // 创建模糊View
        UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
        
        effectView.frame = CGRectMake(0, 0, 320, 200);
        effectView.center = self.view.center;
        [self.view addSubview:effectView];
        
        
        UILabel *label = [[UILabel alloc] initWithFrame:effectView.bounds];
        label.text = @"东方未明";
        label.textAlignment = NSTextAlignmentCenter;
        label.font = [UIFont systemFontOfSize:30];
    //    [effectView.contentView addSubview:label];
        // 在创建的模糊View的上面再添加一个子模糊View
        UIVisualEffectView *subEffectView = [[UIVisualEffectView alloc] initWithEffect:[UIVibrancyEffect effectForBlurEffect:(UIBlurEffect *)effectView.effect]];
        
        subEffectView.frame = effectView.bounds;
        
        [effectView.contentView addSubview:subEffectView];
        
        [subEffectView.contentView addSubview:label];
    }
    
    - (void)panGesture:(UIPanGestureRecognizer *)gesture
    {
        CGPoint point = [gesture translationInView:gesture.view];
        gesture.view.center = CGPointMake(gesture.view.center.x + point.x,
                                          gesture.view.center.y + point.y);
        [gesture setTranslation:CGPointZero inView:gesture.view];
    }
    

    效果:


    1.gif

    相关文章

      网友评论

        本文标题:iOS 模糊效果的使用

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