【问题标题】:How to use a CIFilter on the layerClass instance of an UIView?如何在 UIView 的 layerClass 实例上使用 CIFilter?
【发布时间】:2013-05-17 04:39:00
【问题描述】:

我的 UIView 正在为其层使用 TBPaperLayer 的实例。

+(Class)layerClass {
    return [TBPaperLayer class];
}

我想创建一个 CIFilter 来修改这个层的外观 - 特别是在它上面应用一个模糊过滤器。 如何使用此代码模糊该图层的一部分? (代码来自:Blur CALayer's Superlayer

CALayer *blurLayer = [CALayer layer];
CIFilter *blur = [CIFilter filterWithName:@"CIGaussianBlur"];
[blur setDefaults];
blurLayer.backgroundFilters = [NSArray arrayWithObject:blur];
[self.superlayer addSublayer:blurLayer];

-init期间没有超层。

【问题讨论】:

  • 请注意,链接的解决方案适用于 Mac,您可以在其中为视图提供 Core Image 过滤器一段时间。我不相信你可以在 iOS 上使用 UIViews 和 CALayers 来做到这一点,但我可能在最近的更新中错过了一些东西。

标签: ios core-animation core-image


【解决方案1】:

这在 iOS 上是不可能的。来自CALayer class reference

特殊注意事项

iOS 中的图层不支持此属性。

大概苹果不觉得当前这一代的 iOS 硬件强大到足以支持实时图像过滤。

【讨论】:

    【解决方案2】:

    对于 iOS 6.1,我想要一个视图来封装标题序列的某些动态图形中使用的向内收缩和去模糊效果。我生成的代码(此处未全部显示)稳步降低拉伸因子(向内缩小文本的水平比例)和模糊量。应用此效果的文本呈现为 UIBezierPath 并存储在 self.myPath 中。计时器触发减少这两个值的方法并调用 setNeedsDisplay。

    - (void)displayLayer:(CALayer *)layer
    {
        UIGraphicsBeginImageContext(self.bounds.size);
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGAffineTransform stretch = CGAffineTransformMakeScale(self.stretchFactor + 1.0, 1.0);
        CGPathRef stretchedPath = CGPathCreateCopyByTransformingPath([self.myPath CGPath], &stretch);
        CGRect newBox = CGPathGetBoundingBox(stretchedPath);
        float deltaX = CGRectGetMidX(self.bounds) - CGRectGetMidX(newBox);
        float deltaY = CGRectGetMidY(self.bounds) - CGRectGetMidY(newBox);
        CGAffineTransform slide = CGAffineTransformMakeTranslation(deltaX, deltaY);
        CGPathRef centeredPath = CGPathCreateCopyByTransformingPath(stretchedPath, &slide);
        CGPathRelease(stretchedPath);
        CGContextAddPath(ctx, centeredPath);
        CGPathRelease(centeredPath);
        CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
        CGContextFillPath(ctx);
        UIImage *tmpImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        CIImage *inputImage = [CIImage imageWithCGImage:[tmpImage CGImage]];
        CIFilter *gBlurFilter = [CIFilter filterWithName:@"CIGaussianBlur"
                                       keysAndValues:@"inputRadius", [NSNumber numberWithFloat:self.blurFactor],
                                                     @"inputImage", inputImage, nil];
        CIImage *blurredImage = [gBlurFilter outputImage];
        CIContext *context = [CIContext contextWithOptions:nil];
        CGImageRef cgimg = [context createCGImage:blurredImage fromRect:[blurredImage extent]];
        [layer setContents:(__bridge id)cgimg];
        CGImageRelease(cgimg);
    }
    
    - (void)drawRect:(CGRect)rect
    {
        // empty drawRect: to get the attention of UIKit
    }
    

    我还没有检查这个代码是否有泄漏,所以认为它是“伪代码” :-) 如图所示,这可以在 drawRect: 中完成,而不是使用层,但我还有其他事情正在处理这个视图而不是在此精简版中显示。

    但由于 CIGaussianBlur 需要大量时间,我正在查看 image processing using the Accelerate framework 以了解如何使我的版本更加流畅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-17
      • 2013-05-22
      • 1970-01-01
      • 2013-11-03
      • 2010-11-12
      • 2013-03-22
      • 2015-05-19
      • 1970-01-01
      相关资源
      最近更新 更多