将CIFilter应用于CALayer

6

CI Filters现在可以在iOS 5中使用,我正在尝试将其中一个应用到CALayer中,就像在Mac上一样。这是我的代码:

CALayer *myCircle = [CALayer layer];
myCircle.bounds = CGRectMake(0,0,30,30);
myCircle.position = CGPointMake(100,100);
myCircle.cornerRadius = 15;
myCircle.borderColor = [UIColor whiteColor].CGColor;
myCircle.borderWidth = 2;
myCircle.backgroundColor = [UIColor whiteColor].CGColor;

CIFilter *blurFilter = [CIFilter filterWithName:@"CIDiscBlur"];
[blurFilter setDefaults];
[blurFilter setValue:[NSNumber numberWithFloat:5.0f] forKey:@"inputRadius"];
[myCircle setFilters:[NSArray arrayWithObjects:blurFilter, nil]];

[self.view.layer addSublayer:myCircle];

我的白色圆形画得很好,但滤镜没有被应用。


2
从CALayer文档中可以看到:“iOS注意:尽管iOS中的CALayer类公开了filters属性,但Core Image不可用。当前此属性可用的滤镜未定义。” - 所以我不确定它是否真正工作。 - Krumelur
此外,Mac 上的模糊滤镜在 iOS 的 Core Image 实现中目前都不受支持:https://dev59.com/D2oy5IYBdhLWcg3wdt8L - Brad Larson
1个回答

6
除了 CIDiskBlur 目前(iOS SDK 5.1)不可用以及 setFilters: 似乎也不可用之外,您可以执行以下操作:
从图层内容创建输入 CIImage:
CIImage *inputImage = [CIImage imageWithCGImage:(CGImageRef)(myCircle.contents)];`

应用您的筛选器并获取一个CGImageRef结果:
CIFilter *filter = [CIFilter filterWith...];// A filter that is available in iOS or a custom one :)
...
CIImage *outputImage = [filter outputImage];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];

最后将CGImageRef设置为图层:
[myCircle setContents:(id)cgimg];

这应该可以工作 :)

这要看情况,我认为在过滤器内部我们无法做太多事情,我们可以尝试使用OpenGL直接绘制到图层,而不是创建CGImageRef并使用setContents: - nacho4d
我们也可以提交一个错误报告并请求使用 setFilters:,然后坐等结果 :p。 - nacho4d
乒乓球.. 直接设置过滤器是可能的吗? - Fawkes
@nacho4d,直接应用过滤器是否可行? - Mrugesh Tank
抱歉我没有时间深入研究这个问题。显然是有可能的。请查看这些笔记:https://github.com/shinobicontrols/iOS8-day-by-day/blob/master/19-core-image-kernels/19-core-image-kernels.md - nacho4d
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接