前言
- 介绍几种简单的滤镜,
|
---|
API & Property
NS_ASSUME_NONNULL_BEGIN
typedef NS_OPTIONS(NSInteger, KJRenderFilterType) {
KJRenderFilterTypeOriginal = 0,/// 原片
KJRenderFilterTypeColor,/// 颜色滤镜
KJRenderFilterTypeSketch, /// 素描滤镜
KJRenderFilterTypeCoreImage,/// CoreImage 自带滤镜
};
/// CoreImage 滤镜
typedef NS_OPTIONS(NSInteger, KJRenderCoreImageFilterType) {
KJRenderCoreImageFilterTypeSepia = 0,/// 褐色滤镜(怀旧)
KJRenderCoreImageFilterTypeColorInvert,/// 颜色反转
};
static NSString * const _Nonnull KJRenderCoreImageFilterTypeStringMap[] = {
[KJRenderCoreImageFilterTypeSepia] = @"CISepiaTone",
[KJRenderCoreImageFilterTypeColorInvert] = @"CIColorInvert",
};
static NSString * const _Nonnull KJRenderCoreImageFilterTypeKeyStringMap[] = {
[KJRenderCoreImageFilterTypeSepia] = @"inputIntensity",
[KJRenderCoreImageFilterTypeColorInvert] = @"",
};
@class KJRenderInfo;
@interface KJRenderImageView : UIImageView
/// 初始化
- (instancetype)kj_initWithOriImage:(UIImage*)image ExtendParameterBlock:(void(^_Nullable)(KJRenderImageView *obj))paramblock;
/// 修改效果
- (void)kj_changeRenderInfo:(KJRenderInfo*)info;
#pragma mark - ExtendParameterBlock 扩展参数
@property(nonatomic,strong,readonly) KJRenderImageView *(^kAddView)(UIView*);
@property(nonatomic,strong,readonly) KJRenderImageView *(^kFrame)(CGRect);
@end
@interface KJRenderInfo : NSObject
@property(nonatomic,assign)KJRenderFilterType type; /// 滤镜
@property(nonatomic,assign)float opacity;/// 透明度,默认 1
@property(nonatomic,assign)float extend;/// 扩展
@property(nonatomic,strong)UIColor *color;/// 颜色滤镜
@property(nonatomic,assign)KJRenderCoreImageFilterType coreType;/// CoreImage 滤镜
@end
NS_ASSUME_NONNULL_END
简单介绍思路
KJRenderInfo滤镜模型数据
目前有四种滤镜
typedef NS_OPTIONS(NSInteger, KJRenderFilterType) {
KJRenderFilterTypeOriginal = 0,/// 原片
KJRenderFilterTypeColor,/// 颜色滤镜
KJRenderFilterTypeSketch, /// 素描滤镜
KJRenderFilterTypeCoreImage,/// CoreImage 自带滤镜
};
1.KJRenderFilterTypeColor 颜色滤镜
这种滤镜的主要实现方式其实就是给图片加个颜色滤镜,就不做多余赘述
/// 颜色滤镜
- (UIImage*)kj_colorRenderInfo:(KJRenderInfo*)info{
UIGraphicsBeginImageContext(self.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.originImage drawInRect:self.bounds];
CGContextSetFillColorWithColor(context, [info.color colorWithAlphaComponent:info.extend].CGColor);
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextFillRect(context, self.bounds);
CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage *newImage = [UIImage imageWithCGImage:imageRef];
UIGraphicsEndImageContext();
CGImageRelease(imageRef);
return newImage;
}
2.KJRenderFilterTypeSketch 素描滤镜
其实核心还是CoreImage的滤镜使用,先去色CIPhotoEffectMono
,然后拷贝反色CIColorInvert
,再高斯模糊CIGaussianBlur
,最后混合叠加到去色图片CIColorDodgeBlendMode
/// 素描滤镜
- (void)kj_sketchRenderInfo:(KJRenderInfo*)info{
_weakself;
kGCD_QUEUE_ASYNC(^{
/// 去色
CIImage * inputImage = [[CIImage alloc] initWithImage:weakself.originImage];
CIFilter * monoFilter = [CIFilter filterWithName:@"CIPhotoEffectMono"];
[monoFilter setValue:inputImage forKey:kCIInputImageKey];
CIImage * outImage = [monoFilter outputImage];
/// 拷贝反色
CIImage * invertImage = [outImage copy];
CIFilter * invertFilter = [CIFilter filterWithName:@"CIColorInvert"];
[invertFilter setValue:invertImage forKey:kCIInputImageKey];
invertImage = [invertFilter outputImage];
/// 高斯模糊
CIFilter * blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
[blurFilter setValue:@(info.extend*100) forKey:kCIInputRadiusKey];
[blurFilter setValue:invertImage forKey:kCIInputImageKey];
invertImage = [blurFilter valueForKey:kCIOutputImageKey];
/// 混合叠加到去色图片
CIFilter * blendFilter = [CIFilter filterWithName:@"CIColorDodgeBlendMode"];
[blendFilter setValue:invertImage forKey:kCIInputImageKey];
[blendFilter setValue:outImage forKey:kCIInputBackgroundImageKey];
CIImage * sketchImage = [blendFilter outputImage];
/// 渲染图片
CGImageRef cgImage = [weakself.ciContext createCGImage:sketchImage fromRect:[inputImage extent]];
kGCD_MAIN_ASYNC(^{
weakself.image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
});
});
}
3.KJRenderFilterTypeCoreImage
CoreImage 滤镜,褐色滤镜,颜色反转
/// CoreImage 滤镜
typedef NS_OPTIONS(NSInteger, KJRenderCoreImageFilterType) {
KJRenderCoreImageFilterTypeSepia = 0,/// 褐色滤镜(怀旧)
KJRenderCoreImageFilterTypeColorInvert,/// 颜色反转
};
static NSString * const _Nonnull KJRenderCoreImageFilterTypeStringMap[] = {
[KJRenderCoreImageFilterTypeSepia] = @"CISepiaTone",
[KJRenderCoreImageFilterTypeColorInvert] = @"CIColorInvert",
};
static NSString * const _Nonnull KJRenderCoreImageFilterTypeKeyStringMap[] = {
[KJRenderCoreImageFilterTypeSepia] = @"inputIntensity",
[KJRenderCoreImageFilterTypeColorInvert] = @"",
};
/// coreImage 滤镜
- (void)kj_coreImageRenderInfo:(KJRenderInfo*)info{
_weakself;
dispatch_queue_t globel = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globel, ^{
CIFilter *filter = [CIFilter filterWithName:KJRenderCoreImageFilterTypeStringMap[info.coreType]];
[filter setDefaults];
[filter setValue:[[CIImage alloc] initWithImage:weakself.originImage] forKey:kCIInputImageKey];
NSString *string = KJRenderCoreImageFilterTypeKeyStringMap[info.coreType];
if (![string isEqualToString:@""]) [filter setValue:@(info.extend) forKey:string];
CIImage *outputImage = [filter outputImage];
CGImageRef filterimge = [weakself.ciContext createCGImage:outputImage fromRect:outputImage.extent];
dispatch_queue_t main = dispatch_get_main_queue();
dispatch_async(main, ^{
weakself.image = [UIImage imageWithCGImage:filterimge];
CGImageRelease(filterimge);
});
});
}
使用示例
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_weakself;
CGFloat sp = kAutoW(10);
CGFloat w = (kScreenW-sp*3)/2;
CGFloat h = w;
CGFloat maxY = 64.;
UIImage *image = kGetImage(@"IMG_4931");
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(sp, maxY+sp, w, h)];
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.backgroundColor = [UIColor.orangeColor colorWithAlphaComponent:0.1];
imageView.image = image;
[self.view addSubview:imageView];
__block NSArray <KJRenderInfo*>*renderTemps = @[({
KJRenderInfo *info = [KJRenderInfo new];
info.type = KJRenderFilterTypeOriginal;
info.opacity = 1.;
info;
}),({
KJRenderInfo *info = [KJRenderInfo new];
info.type = KJRenderFilterTypeCoreImage;
info.coreType = KJRenderCoreImageFilterTypeSepia;
info.extend = .8;
info.opacity = 1.;
info;
}),({
KJRenderInfo *info = [KJRenderInfo new];
info.type = KJRenderFilterTypeSketch;
info.extend = .8;
info.opacity = 1.;
info;
}),({
KJRenderInfo *info = [KJRenderInfo new];
info.type = KJRenderFilterTypeColor;
info.extend = .8;
info.color = [UIColor.greenColor colorWithAlphaComponent:0.1];
info;
})];
KJRenderImageView *view = ({
KJRenderImageView *renderImageView = [[KJRenderImageView alloc] kj_initWithOriImage:image ExtendParameterBlock:^(KJRenderImageView * _Nonnull obj) {
obj.kAddView(weakself.view).kFrame(CGRectMake(sp+imageView.maxX, imageView.top, w, h));
}];
renderImageView.backgroundColor = [UIColor.orangeColor colorWithAlphaComponent:0.1];
[renderImageView kj_changeRenderInfo:renderTemps[1]];
renderImageView;
});
KJRenderImageView *view2 = ({
KJRenderImageView *renderImageView = [[KJRenderImageView alloc] kj_initWithOriImage:image ExtendParameterBlock:^(KJRenderImageView * _Nonnull obj) {
obj.kAddView(weakself.view).kFrame(CGRectMake(sp, view.bottom+sp, w, h));
}];
renderImageView.backgroundColor = [UIColor.orangeColor colorWithAlphaComponent:0.1];
[renderImageView kj_changeRenderInfo:renderTemps[2]];
renderImageView;
});
KJRenderImageView *view3 = ({
KJRenderImageView *renderImageView = [[KJRenderImageView alloc] kj_initWithOriImage:image ExtendParameterBlock:^(KJRenderImageView * _Nonnull obj) {
obj.kAddView(weakself.view).kFrame(CGRectMake(sp+view2.maxX, view.bottom+sp, w, h));
}];
renderImageView.backgroundColor = [UIColor.orangeColor colorWithAlphaComponent:0.1];
[renderImageView kj_changeRenderInfo:renderTemps[3]];
renderImageView;
});
}
网友评论