zoukankan      html  css  js  c++  java
  • ios开发笔记-2-毛玻璃效果

    模糊效果,顾名思义,是将你的背景图片进行虚化,模糊,进而在背景图片上增加一些不虚化,不模糊的button等等,从而达到一种吸引用户眼球的效果,通常称之为焦点效应.开发过程中,产生模糊效果的方法很多,下面为大家简单进行介绍.

    1.最简单的方法.

    你去找你的UI,设计一张毛玻璃效果的图片,贴上去,大功告成,模糊效果产生了.简单,易用.但是如果你想学习更多的知识,想通过代码的方式产生模糊效果,我们继续.

    2.CoreImage.

    coreImage是IOS5中新加入的一个Objective-c的框架,提供了强大高效的图像处理功能,用来对基于像素的图像进行操作与分析。iOS提供了很多强大的滤镜(Filter),现在有127种之多,随着框架的更新,这一数字会继续增加。这些Filter提供了各种各样的效果,并且还可以通过滤镜链将各种效果的Filter叠加起来,形成强大的自定义效果,如果你对该效果很满意,还可以子类化滤镜。下面将代码贴在下面,与大家分享,如果对框架不熟悉,建议阅读苹果的官方API.

            CIContext *context = [CIContext contextWithOptions:nil];

            CIImage *inputImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"detail@2x.png"]];

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

            [filter setValue:inputImage forKey:kCIInputImageKey];

            [filter setValue:[NSNumber numberWithFloat:10.0] forKey:@"inputRadius"];

    //        CIImage *result = [filter valueForKey:kCIOutputImageKey];

                CIImage *result=[filter outputImage];

            CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

            UIImage *image = [UIImage imageWithCGImage:cgImage];

            CGImageRelease(cgImage);

            self.imgView.image=image;

    简单易用,推荐使用

     3.vImage

    如果你对性能有极大的追求,那么vImage会适合你,iOS5.0中新增了vImage API可以使用,它属于Accelerate.Framework,所以如果你要使用它要在工程中加入这个Framework。模糊算法使用的是vImageBoxConvolve_ARGB8888这个函数.

    - (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur {  

    if (blur < 0.f || blur > 1.f) {  

            blur = 0.5f;  

        }  

    int boxSize = (int)(blur * 100);  

      boxSize = boxSize - (boxSize % 2) + 1;  

        CGImageRef img = image.CGImage;  

        vImage_Buffer inBuffer, outBuffer;  

        vImage_Error error;  

    void *pixelBuffer;  

        CGDataProviderRef inProvider = CGImageGetDataProvider(img);  

        CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);  

        inBuffer.width = CGImageGetWidth(img);  

        inBuffer.height = CGImageGetHeight(img);  

        inBuffer.rowBytes = CGImageGetBytesPerRow(img);  

        inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);  

        pixelBuffer = malloc(CGImageGetBytesPerRow(img) *   CGImageGetHeight(img));  

    if(pixelBuffer == NULL)  

            NSLog(@"No pixelbuffer");  

        outBuffer.data = pixelBuffer;  

        outBuffer.width = CGImageGetWidth(img);  

        outBuffer.height = CGImageGetHeight(img);  

        outBuffer.rowBytes = CGImageGetBytesPerRow(img);  

        error = vImageBoxConvolve_ARGB8888(&inBuffer,   

                                           &outBuffer,   

                                           NULL,   

                   0,   

                                           0,   

                                           boxSize,   

                                           boxSize,   

                                          NULL,   

                                        kvImageEdgeExtend);  

    if (error) {  

            NSLog(@"error from convolution %ld", error);  

        }  

        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  

        CGContextRef ctx = CGBitmapContextCreate(  

                                        outBuffer.data,  

                                        outBuffer.width,  

                                        outBuffer.height,  

                                        8,  

                                        outBuffer.rowBytes,  

                                        colorSpace,  

                                       kCGImageAlphaNoneSkipLast);  

        CGImageRef imageRef = CGBitmapContextCreateImage (ctx);  

        UIImage *returnImage = [UIImage imageWithCGImage:imageRef];

    //clean up  

        CGContextRelease(ctx);  

        CGColorSpaceRelease(colorSpace);  

        free(pixelBuffer);  

        CFRelease(inBitmapData);  

        CGColorSpaceRelease(colorSpace);  

        CGImageRelease(imageRef);  

    return returnImage;  

    }

    4.第三方库

    可以在网上找到一些不错的第三方库,产生模糊效果.但是个人不推荐使用,断更永远是第三方库最大的诟病.

    5.8.0新开放API

    在评论区看到大神@ZweiZhao的代码,发现开放了新的API,十分感谢.在这里加上注释,与大家分享.

     
    iOS 8 后更新的  UIBlurEffect类和 UIVisualEffectView类使这种特效应用更加便捷,高效.使用也非常简便,UIBlurEffect 类是设定毛玻璃特效的类型,UIVisualEffectView类在创建时加入上一个类对象,剩下的跟普通的view 控件等用法就一样了.

       //  创建需要的毛玻璃特效类型

        UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

        //  毛玻璃view 视图

        UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

        //添加到要有毛玻璃特效的控件中

        effectView.frame = self.imageV.bounds;

        [self.imageV addSubview:effectView];

        //设置模糊透明度

        effectView.alpha = .8f;

    http://blog.sina.cn/dpool/blog/s/blog_92ac2c5b0101cm5b.html?plg_nld=1&plg_uin=1&plg_auth=1&vt=4&plg_usr=1&plg_nld=1&plg_vkey=1&plg_dev=1

    http://www.cnblogs.com/kenshincui/p/3959951.html

     转载: Mr.林的博客
  • 相关阅读:
    React antd如何实现<Upload>组件上传附件再次上传已清除附件缓存问题。
    spring项目logback日志与logstash和Elasticsearch整合
    Java后端面试经验总结分享(一)
    【设计模式】访问者模式
    【设计模式】命令模式
    【设计模式】模板方法模式
    【设计模式】代理模式
    【设计模式】享元模式
    【设计模式】外观模式
    【设计模式】组合模式
  • 原文地址:https://www.cnblogs.com/feng520/p/4962275.html
Copyright © 2011-2022 走看看