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;
}