示例代码下载
查询滤镜系统
Core Image提供的方法允许您在系统中查询可用的内置滤镜以及有关每个滤镜的显示名称,输入参数,参数类型,默认值等相关信息。查询系统可为您提供有关可用滤镜的最新信息。如果您的应用支持让用户选择和设置滤镜,则可以在为滤镜创建用户界面时使用此信息。
获取滤镜和属性列表
使用filterNamesInCategory:和filterNamesInCategories:方法可以准确发现哪些滤镜可用。滤镜以使列表的形式被分类更易于管理。如果您知道滤镜类别,则可以通过调用方法filterNamesInCategory:并提供表4-1,表4-2或表4-3中列出的类别常量之一来找到该类别可用的滤镜。
如果要查找类别列表的所有可用滤镜,可以调用该方法filterNamesInCategories:,提供表中列出的类别常量数组。该方法返回一个NSArray填充了每个类别的滤镜名称的对象。您可以通过提供nil而不是类别常量数组来获取所有类别的所有滤镜的列表。
滤镜可以是多个类别的成员。类别可以指定:
- 滤镜产生的效果类型(颜色调整,扭曲等)。请参阅表4-1。
- 滤镜的使用(静止图像,视频,高动态范围等)。请参阅表4-2。
- 滤镜是否由Core Image(内置)提供。请参阅表4-3。
表4-1 效果类型的滤镜类别常量
效果类型 | 说明 |
---|---|
kCICategoryDistortionEffect | 扭曲效果,如凹凸,旋转,洞 |
kCICategoryGeometryAdjustment | 几何调整,如仿射变换,裁剪,透视变换 |
kCICategoryCompositeOperation | 合成,例如source over,minimum,source atop,color dodge blend mode |
kCICategoryHalftoneEffect | 半色调效果,如屏幕,线条屏幕,阴影线 |
kCICategoryColorAdjustment | 颜色调整,如伽马调整,白点调整,曝光 |
kCICategoryColorEffect | 色彩效果,如色调调整,张贴 |
kCICategoryTransition | 图像之间的过渡,例如溶解,与面具分解,滑动 |
kCICategoryTileEffect | 平铺效果,如平行四边形,三角形 |
kCICategoryGenerator | 图像生成器,如条纹,恒定颜色,棋盘格 |
kCICategoryGradient | 渐变,如轴向,径向,高斯 |
kCICategoryStylize | 风格化,例如像素化,结晶 |
kCICategorySharpen | 锐化,亮度 |
kCICategoryBlur | 模糊,如高斯,变焦,运动 |
表4-2 滤镜用法的滤镜类别常量
使用 | 指示 |
---|---|
kCICategoryStillImage | 可用于静止图像 |
kCICategoryVideo | 可用于视频 |
kCICategoryInterlaced | 可用于隔行扫描图像 |
kCICategoryNonSquarePixels | 可用于非方形像素 |
kCICategoryHighDynamicRange | 可用于高动态范围像素 |
表4-3 滤镜来源的滤镜类别常量
过滤原点 | 指示 |
---|---|
kCICategoryBuiltIn | Core Image提供的滤镜 |
获取滤镜名称列表后,可以通过创建CIFilter对象并按attributes如下方式调用方法来检索滤镜的属性:
CIFilter * myFilter = [CIFilter filterWithName:@“<#Filter Name Here#>”];
NSDictionary * myFilterAttributes = [myFilter attributes];
您将字符串“ <# Filter Name Here #>” 替换为您感兴趣的滤镜的名称。属性包括名称,类别,类,最小值和最大值。有关可返回的属性的完整列表,请参阅CIFilter类参考。
构建滤镜字典
如果您的应用提供了用户界面,则可以查阅滤镜字典以创建和更新用户界面。例如,布尔值的滤镜属性需要一个复选框或类似的用户界面元素,并且在一个范围内连续变化的属性可以使用滑块。您可以使用最大值和最小值作为文本标签的基础。默认属性设置将指示用户界面中的初始设置。
滤镜名称和属性提供了构建用户界面所需的所有信息,允许用户选择滤镜并控制其输入参数。滤镜的属性告诉您滤镜具有多少输入参数,参数名称,数据类型以及最小值,最大值和默认值。
注意: 如果您对构建Core Image滤镜的用户界面感兴趣,请参阅IKFilterUIView类参考,该参考提供包含Core Image滤镜的输入参数控件的视图。
清单4-1显示了获取滤镜名称并按功能类别构建滤镜字典的代码。代码在- kCICategoryGeometryAdjustment,kCICategoryDistortionEffect,kCICategorySharpen和kCICategoryBlur这些类别中检索滤镜生成基于应用程序定义的功能类别字典,例如畸变和焦点字典。功能类别对于在用户有意义在菜单中组织滤镜名称很有用。代码不会遍历所有可能的Core Image滤镜类别,但您可以通过遵循相同的过程轻松扩展此代码。
清单4-1 按功能类别构建滤镜字典的代码
NSMutableDictionary *filtersByCategory = [NSMutableDictionary dictionary];
NSMutableArray *filterNames = [NSMutableArray array];
[filterNames addObjectsFromArray:
[CIFilter filterNamesInCategory:kCICategoryGeometryAdjustment]];
[filterNames addObjectsFromArray:
[CIFilter filterNamesInCategory:kCICategoryDistortionEffect]];
filtersByCategory[@"Distortion"] = [self buildFilterDictionary: filterNames];
[filterNames removeAllObjects];
[filterNames addObjectsFromArray:
[CIFilter filterNamesInCategory:kCICategorySharpen]];
[filterNames addObjectsFromArray:
[CIFilter filterNamesInCategory:kCICategoryBlur]];
filtersByCategory[@"Focus"] = [self buildFilterDictionary: filterNames];
清单4-2显示了清单4-1中buildFilterDictionary调用的例程。此例程为功能类别中的每个滤镜构建属性字典。列表后面为每个编号行代码的详细说明。
清单4-2 按功能名称构建滤镜字典
- (NSMutableDictionary *)buildFilterDictionary:(NSArray *)filterClassNames // 1
{
NSMutableDictionary *filters = [NSMutableDictionary dictionary];
for (NSString *className in filterClassNames) { // 2
CIFilter *filter = [CIFilter filterWithName:className]; // 3
if (filter) {
filters[className] = [filter attributes]; // 4
} else {
NSLog(@"could not create '%@' filter", className);
}
}
return filters;
}
这是代码的作用:
- 将一组滤镜名称作为输入参数。回想一下清单4-1,该数组可以是来自多个Core Image滤镜类别的滤镜名称的串联。在此示例中,数组基于功能类别被程序设置(Distortion或Focus)。
- 迭代滤镜名称数组。
- 检索滤镜名称的滤镜对象。
- 检索滤镜的属性字典,并将其添加到例程返回的字典中。
注意: 在OS X v10.5及更高版本中运行的应用程序可以使用CIFilter Image Kit添加来提供滤镜浏览器和用于设置滤镜输入参数的视图。请参阅CIFilter Image Kit Additions和ImageKit Programming Guide。