滤镜是否会蒙蔽你的双眼?

简介: 滤镜是否会蒙蔽你的双眼?

API & Property


/// 初始化
- (instancetype)kj_initWithOriImage:(UIImage *)image ExtendParameterBlock:(void(^_Nullable)(KJRenderImageView *obj))paramblock;
/// 修改效果
- (void)kj_changeRenderInfo:(KJRenderInfo *)info;
@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

1.png


简单介绍思路


KJRenderInfo滤镜模型数据


目前有四种滤镜

typedef NS_OPTIONS(NSInteger, KJRenderFilterType) {
    KJRenderFilterTypeOriginal,  /// 原片
    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;
    });
}

备注:本文用到的部分函数方法和Demo,均来自三方库KJCategories


滤镜介绍就到此完毕,后面有相关再补充

相关文章
|
供应链 安全 Shell
供应链投毒预警 | 开源供应链投毒 202401 最新月报来啦!
悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库,结合程序动静态分析方法对潜在风险的开源组件包进行分析和监测,捕获大量开源组件恶意包投毒攻击事件。2024 年 1 月份,悬镜供应链安全情报中心在 Npm 官方仓库(https://www.npmjs.com/)和 Pypi 官方仓库(https://pypi.org/)上共捕获 675 个不同版本的恶意投毒包,其中 Npm 仓库投毒占比 90.48%, Pypi 仓库投毒占比 9.52%, 从每日捕获的投毒包数据来看,Npm 仓库仍然是开源组件投毒的重灾区。
471 1
|
存储 人工智能 Serverless
方案测评 | 10分钟上手主动式智能导购AI助手构建
本文介绍了一种基于Multi-Agent架构的智能导购系统方案,利用百炼的Assistant API快速构建,旨在10分钟内完成搭建并实现精准的商品推荐。通过详细的操作指南,展示了从获取API Key、创建函数计算应用、部署示例网站、验证导购效果到集成商品检索应用等全过程,最后提出了关于文档完善、功能优化等方面的体验反馈。
|
人工智能 自然语言处理 搜索推荐
AI 赋能:开启内容生产效率革命的密钥》
在数字化时代,AI技术正成为提高内容生产效率的关键工具。本文探讨了AI在文章写作、文案创作、翻译、图像识别与生成及数据分析等方面的应用,分析了其提高效率的方式、带来的优势与挑战,并通过新闻媒体、营销、教育等行业案例,展望了AI在内容生产领域的未来。
528 3
|
Linux Shell Perl
在Linux中,如何使用sed命令进行文本替换?
在Linux中,如何使用sed命令进行文本替换?
|
数据可视化 IDE 数据挖掘
揭秘Conda:Python开发者必备的包管理神器
揭秘Conda:Python开发者必备的包管理神器
305 1
|
内存技术
经验大分享:UBB语法介绍
经验大分享:UBB语法介绍
464 0
|
存储 自然语言处理 容灾
即时通讯技术文集(第19期):IM架构设计基础知识合集 [共13篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第19 期。
254 0
|
Java Spring
SpringMVC中转发与重定向(redirect与forward)实践实例
SpringMVC中转发与重定向(redirect与forward)实践实例
605 0
|
应用服务中间件 API nginx
SpringCloud Gateway中路由维护的三种方法
分别介绍使用配置文件,RouteLocatorBuilder和RouteDefinitionWriter三种方法维护网关路由
658 0
|
SQL 存储 Linux
HIVE 表 DLL 基本操作(一)——第1关:Create/Alter/Drop 数据库
HIVE 表 DLL 基本操作(一)——第1关:Create/Alter/Drop 数据库
1474 0