iOS自定义控件及相关iOS精英班程序员

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

2016-05-15  本文已影响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;
}
上一篇 下一篇

猜你喜欢

热点阅读