美文网首页iOS自定义控件及相关iOS精英班程序员
iOS关于图片的毛玻璃效果处理(滤镜)

iOS关于图片的毛玻璃效果处理(滤镜)

作者: 当阳桥 | 来源:发表于2016-05-15 17:35 被阅读1265次

上一周有一个项目需求是要求对图片进行虚化处理,于是在网上找了些资料可以达到虚化效果,现在做一下总结:

单独针对UIImage进行滤镜处理的方法:

#import <UIKit/UIKit.h>

@interface UIImage (ZFFilter)
/**
 *  图片滤镜处理
 *
 *  @param image  UIImage类型
 *  @param radius 虚化参数
 *
 *  @return 虚化后的UIImage
 */
+ (UIImage *)filterWith:(UIImage *)image andRadius:(CGFloat)radius;
@end

#import "UIImage+ZFFilter.h"

@implementation UIImage (ZFFilter)

+ (UIImage *)filterWith:(UIImage *)image andRadius:(CGFloat)radius{
    
    CIImage *inputImage = [[CIImage alloc] initWithCGImage:image.CGImage];
    
    CIFilter *affineClampFilter = [CIFilter filterWithName:@"CIAffineClamp"];
    CGAffineTransform xform = CGAffineTransformMakeScale(1.0, 1.0);
    [affineClampFilter setValue:inputImage forKey:kCIInputImageKey];
    [affineClampFilter setValue:[NSValue valueWithBytes:&xform
                                               objCType:@encode(CGAffineTransform)]
                         forKey:@"inputTransform"];
    
    CIImage *extendedImage = [affineClampFilter valueForKey:kCIOutputImageKey];
    
    CIFilter *blurFilter =
    [CIFilter filterWithName:@"CIGaussianBlur"];
    [blurFilter setValue:extendedImage forKey:kCIInputImageKey];
    [blurFilter setValue:@(radius) forKey:@"inputRadius"];
    
    CIImage *result = [blurFilter valueForKey:kCIOutputImageKey];
    
    CIContext *ciContext = [CIContext contextWithOptions:nil];
    
    CGImageRef cgImage = [ciContext createCGImage:result fromRect:inputImage.extent];
    
    UIImage *uiImage = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);
    
    return uiImage;
}

@end

但是有时候我们没有拿到Image就不能用上面的方法了;
(比如直接使用SDWebImage的sd_setImageWithURL:方法。当然你可以直接使用 [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:url options:SDWebImageCacheMemoryOnly progress:nil completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {}];获取到Image之后使用上述方法,但是放到ImageView中每次reloadData时候就会出现图片闪动问题,没有sd_setImageWithURL:方法平滑)

暂时不想解决那个问题,可以使用在图片的imageView上面盖一层毛玻璃视图,下面的方法处理:

- (void)BlurWithImageView:(UIImageView *)imageview{
    
    if ([UIDevice currentDevice].systemVersion.floatValue>=8.0) {
        /**  毛玻璃特效类型
         *  UIBlurEffectStyleExtraLight,
         *  UIBlurEffectStyleLight,
         *  UIBlurEffectStyleDark
         */
        UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
        
        //  毛玻璃视图
        UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
        self.effectView = effectView;
        
        //添加到要有毛玻璃特效的控件中
        [self.imageView addSubview:effectView];
        
        [effectView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(self.imageView);
        }];
        //设置模糊透明度
        effectView.alpha = 0.95f;
    }else{
        [self BlurWithImageViewForiOS7:nil];
    
    }

}

- (void)BlurWithImageViewForiOS7:(UIImageView*)imageView{
        UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:self.contentView.bounds];
        toolbar.barStyle = UIBarStyleBlackTranslucent;
        self.effectView = toolbar;
        [self.imageView addSubview:toolbar];
        toolbar.alpha = 0.95f;
}

相关文章

网友评论

  • 梁森的简书:使用滤镜处理太耗CPU 卡的不行
  • 闪电迷:我刚才用了一下第一个方案,就是单独针对Image 进行滤镜处理,只要执行了那个方法,内存就会飙升
    闪电迷: @buyi_iOS 嗯。是我用的那个地方调用的次数太多了
    当阳桥:@物是_人已非 做一下缓存应该好些
  • 闪电迷:需要

本文标题:iOS关于图片的毛玻璃效果处理(滤镜)

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