zoukankan      html  css  js  c++  java
  • iOS 图片背景模糊效果

    1.使用CoreImage中的模糊滤镜

    原始效果图例如以下:

    这里写图片描写叙述

    CoreImage的实现:

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        UIImage * image = [UIImage imageNamed:@"icon"];
    
        /*..CoreImage中的模糊效果滤镜..*/
    
        //CIImage,相当于UIImage,作用为获取图片资源
        CIImage * ciImage = [[CIImage alloc]initWithImage:image
                             ];
        //CIFilter,高斯模糊滤镜
        CIFilter * blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
    
        //将图片输入到滤镜中
        [blurFilter setValue:ciImage forKey:kCIInputImageKey];
    
        //用来查询滤镜能够设置的參数以及一些相关的信息
        NSLog(@"%@",[blurFilter attributes]);
    
        //设置模糊程度,默觉得10,取值范围(0-100)
       [blurFilter setValue:@(20) forKey:@"inputRadius"];
    
        //将处理好的图片输出
        CIImage * outCiImage = [blurFilter valueForKey:kCIOutputImageKey];
    
        //CIContext
        CIContext * context = [CIContext contextWithOptions:nil];
    
        //获取CGImage句柄,也就是从数据流中取出图片
        CGImageRef outCGImage = [context createCGImage:outCiImage fromRect:[outCiImage extent]];
    
        //终于获取到图片
        UIImage * blurImage = [UIImage imageWithCGImage:outCGImage];
    
        //释放CGImage句柄
        CGImageRelease(outCGImage);
    
        UIImageView * imageView = [[UIImageView alloc]initWithFrame:self.view.bounds];
        imageView.image = blurImage;
        [self.view addSubview:imageView];
    
    }
    
    [blurFilter attributes]打印结果例如以下:
    //參数以及一些相关的信息,假设不做不论什么的设置,默认程度为10( CIAttributeDefault = 10);
    {
        "CIAttributeFilterAvailable_Mac" = "10.4";
        "CIAttributeFilterAvailable_iOS" = 6;
        CIAttributeFilterCategories =     (
            CICategoryBlur,
            CICategoryStillImage,
            CICategoryVideo,
            CICategoryBuiltIn
        );
        CIAttributeFilterDisplayName = "Gaussian Blur";
        CIAttributeFilterName = CIGaussianBlur;
        CIAttributeReferenceDocumentation = "http://developer.apple.com/cgi-bin/apple_ref.cgi?

    apple_ref=//apple_ref/doc/filter/ci/CIGaussianBlur"; inputImage = { CIAttributeClass = CIImage; CIAttributeDescription = "The image to use as an input image. For filters that also use a background image, this is the foreground image."; CIAttributeDisplayName = Image; CIAttributeType = CIAttributeTypeImage; }; inputRadius = { CIAttributeClass = NSNumber; CIAttributeDefault = 10; CIAttributeDescription = "The radius determines how many pixels are used to create the blur. The larger the radius, the blurrier the result."; CIAttributeDisplayName = Radius; CIAttributeIdentity = 0; CIAttributeMin = 0; CIAttributeSliderMax = 100; CIAttributeSliderMin = 0; CIAttributeType = CIAttributeTypeScalar; }; }

    默认程度为10效果图例如以下:
    这里写图片描写叙述
    默认程度为50效果图例如以下:
    这里写图片描写叙述

    2.使用UIImage+ImageEffects

    到该地址下载:https://github.com/YouXianMing/UIImageBlur,里面还有非常多好东西,值得关注;
    导入UIImage+ImageEffects文件到project中就可以使用;

    UIImage+ImageEffects的实现:

    UIImage * image = [UIImage imageNamed:@"icon"];
    //模糊效果渲染耗费时间,建议在子线程中渲染
    //对图片进行模糊
        UIImage * blurImage = [image blurImage];
    
        //设置模糊度
        UIImage * blurImage1 = [image blurImageWithRadius:10];
    
        //设置局部模糊度
        UIImage * blurImage2 = [image blurImageAtFrame:CGRectMake(0, 0, image.size.width, image.size.height/2)];
    
        //灰度效果
        UIImage * blurImage3 = [image grayScale];
    
        /*其它的一些方法,能够自己尝试使用
         //固定宽度与固定高度
         - (UIImage *)scaleWithFixedWidth:(CGFloat)width;
         - (UIImage *)scaleWithFixedHeight:(CGFloat)height;
         //平均的颜色
         - (UIColor *)averageColor;
         //裁剪图片的一部分
         - (UIImage *)croppedImageAtFrame:(CGRect)frame;
         */
    
        UIImageView * imageView = [[UIImageView alloc]initWithFrame:self.view.bounds];
        imageView.image = blurImage;
        [self.view addSubview:imageView];
    

    效果图分别例如以下:
    这里写图片描写叙述

    //局部模糊

    这里写图片描写叙述

    //灰色

    这里写图片描写叙述

    3.使用UIVisualEffectView

    注意:UIVisualEffectView仅仅适用用户iOS 8或以上,才干够使用8下面则不能使用;

    UIVisualEffectView的实现:

    1.直接将文本内容加在effectView(该情况下的文本内容不能与背景相符应);

    UIImage * image = [UIImage imageNamed:@"icon"];
    
        UIImageView * imageView = [[UIImageView alloc]initWithFrame:self.view.bounds];
        imageView.image = image;
        [self.view addSubview:imageView];
    
        UIBlurEffect * blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
        //创建模糊view
        UIVisualEffectView * effectView = [[UIVisualEffectView alloc]initWithEffect:blur];
        effectView.frame = CGRectMake(0, 250, imageView.frame.size.width, 200);
        [imageView addSubview:effectView];
    
        //加入显示文本
        UILabel * lable = [[UILabel alloc]initWithFrame:effectView.bounds];
        lable.text = @"哈哈哈哈哈";
        lable.textAlignment = NSTextAlignmentCenter;
        lable.font = [UIFont systemFontOfSize:24];
        [effectView.contentView addSubview:lable];
    

    效果图例如以下:
    这里写图片描写叙述

    2.加在effectView的子view中使文本与背景相符应;

    UIImage * image = [UIImage imageNamed:@"icon"];
    
        UIImageView * imageView = [[UIImageView alloc]initWithFrame:self.view.bounds];
        imageView.image = image;
        [self.view addSubview:imageView];
    
        UIBlurEffect * blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
        //创建模糊view
        UIVisualEffectView * effectView = [[UIVisualEffectView alloc]initWithEffect:blur];
        effectView.frame = CGRectMake(0, 250, imageView.frame.size.width, 200);
        [imageView addSubview:effectView];
    
        //加入显示文本
        UILabel * lable = [[UILabel alloc]initWithFrame:effectView.bounds];
        lable.text = @"哈哈哈哈哈";
        lable.textAlignment = NSTextAlignmentCenter;
        lable.font = [UIFont systemFontOfSize:24];
    
        //创建模糊子view的UIVisualEffectView
    
        //1.创建出子模糊view
        UIVisualEffectView * subEffectView = [[UIVisualEffectView alloc]initWithEffect:[UIVibrancyEffect effectForBlurEffect:(UIBlurEffect *)effectView.effect]];
    
        //2.设定尺寸
        subEffectView.frame = effectView.bounds;
    
        //3.将子模糊view加入到effectView的contentView才干够生效
        [effectView.contentView addSubview:subEffectView];
    
        //4.加入要显示的view来达到特殊的效果
        [subEffectView.contentView addSubview:lable];
    

    效果图例如以下:
    这里写图片描写叙述

    4.下载图片后自己主动模糊效果

    在项目中导入UIImage+ImageEffects和GCD文件;
    UIImage+ImageEffects地址:https://github.com/YouXianMing/UIImageBlur;
    GCD地址:https://github.com/YouXianMing/GCD-Program;

    代码的实现:

    创建一个UIView的子类,命名为BlurDownloadPicView;
    BlurDownloadPicView.h的里面内容:

    #import <UIKit/UIKit.h>
    
    @interface BlurDownloadPicView : UIView
    //图片下载地址
    @property (nonatomic, strong)NSString * picUrl;
    //图片显示的方式
    @property (nonatomic)UIViewContentMode contentMode;
    
    //開始运行
    - (void)startProgress;
    
    @end
    

    BlurDownloadPicView.m的里面内容:

    #import "BlurDownloadPicView.h"
    #import "GCD.h"
    #import "UIImage+ImageEffects.h"
    
    @interface BlurDownloadPicView ()
    @property (nonatomic, strong)UIImageView * imageView;
    
    @end
    
    @implementation BlurDownloadPicView
    
    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            [self loadSubViews];
        }
        return self;
    }
    - (void)loadSubViews
    {
        self.imageView = [[UIImageView alloc]initWithFrame:self.bounds];
        self.imageView.alpha = 0;
        [self addSubview:self.imageView];
    }
    
    
    - (void)startProgress
    {
        if (self.picUrl) {
    
    
    
            [GCDQueue executeInGlobalQueue:^{
                //创建请求
                NSURLRequest * request = [NSURLRequest  requestWithURL:[NSURL URLWithString:self.picUrl]];
    
                //由于是同步请求,会堵塞主线程(mainQueue)
                NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    
                //获取图片
                UIImage * image = [[UIImage alloc]initWithData:data];
    
                //对图片进行模糊,会堵塞主线程(mainQueue)
                UIImage * blurImage = [image blurImage];
    
                [GCDQueue executeInMainQueue:^{
                    //载入图片
                    self.imageView.image = blurImage;
    
                    [UIView animateWithDuration:1 animations:^{
                        self.imageView.alpha = 1;
                    }];
                }];
            }];
    
        }
    }
    //重写set,get方法
    -(void)setContentMode:(UIViewContentMode)contentMode
    {
        self.contentMode  = contentMode;
        self.imageView.contentMode = contentMode;
    }
    - (UIViewContentMode)contentMode
    {
        return self.contentMode;
    }

    在ViewController.m里面的实现;
    引入#import “BlurDownloadPicView.h”头文件

    在viewDidLoad里面的代码实现
    - (void)viewDidLoad {
        [super viewDidLoad];
      NSString * picUrl = @"http://i4.download.fd.pchome.net/g1/M00/0D/1C/oYYBAFTEeAmIWRXgAAKhY5iKdP8AACP_QP4y0IAAqF7878.jpg";
    
        BlurDownloadPicView * blurPicView = [[BlurDownloadPicView alloc]initWithFrame:self.view.bounds];
        [self.view addSubview:blurPicView];
        blurPicView.picUrl = picUrl;
        [blurPicView startProgress];
    }

    效果图例如以下:
    这里写图片描写叙述

  • 相关阅读:
    Sql server数据库设计 7
    day08作业
    day01作业
    day07作业.
    day05作业
    day04作业
    day02作业
    初学Java的一些注意事项
    day07作业
    Week03面向对象入门
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7257026.html
Copyright © 2011-2022 走看看