首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CAShapeLayer与CIFilters

CAShapeLayer与CIFilters
EN

Stack Overflow用户
提问于 2015-10-28 06:29:27
回答 1查看 843关注 0票数 0

我想把CIFilter应用于CAShapeLayer.filters。这是否正确的假设:

  • 创建CAShapeLayer
  • 从CGImage或UIImage创建CAShapeLayer
  • 使用CIFilter或CGImage创建UIImage
  • 将CIFilter添加到CAShapeLayer.filters

要从CGImage创建CAShapeLayer,我使用了CAShapeLayer.contents,但在我的示例中,内容为零,而且如果将CAShapeLayer呈现给图像上下文,则无法获得图像。

代码语言:javascript
复制
override func layoutSubviews()
    {
        if(self.shapeLayer == nil && self.path != nil && self.pathOriginationSize != CGSizeZero)
        {
            let scaleFactor = self.scaleFactor(self.pathOriginationSize, targetSize: self.bounds.size)

            _scaledPath = UIBezierPath(CGPath: self.path.CGPath)
            _scaledPath.lineWidth = self.path.lineWidth
            _scaledPath.applyTransform(CGAffineTransformMakeScale(scaleFactor.x, scaleFactor.y))
            _scaledPath.lineCapStyle = CGLineCap.Round

            self.shapeLayer = CAShapeLayer()
            self.shapeLayer.path = _scaledPath.CGPath
            self.shapeLayer.strokeColor = UIColor.blackColor().CGColor
            self.shapeLayer.lineWidth = self.path.lineWidth

            let imageSize = CGPathGetBoundingBox(_scaledPath.CGPath).size

            UIGraphicsBeginImageContextWithOptions(imageSize, false, UIScreen.mainScreen().scale)
            let context = UIGraphicsGetCurrentContext()
            self.shapeLayer.renderInContext(context!)
            _ = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

            let cgImage = self.shapeLayer.contents as! CGImageRef

            let inputImage = CIImage(CGImage: cgImage)

            let blurFilter = CIFilter(name: "CIZoomBlur")
            blurFilter?.setValue(inputImage, forKey: kCIInputImageKey)
            blurFilter?.setDefaults()
            self.shapeLayer.filters = [blurFilter!]
            self.shapeLayer.shouldRasterize = true

            self.layer.addSublayer(self.shapeLayer)
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-28 14:15:27

CALayer.filters不是在iOS上实现的。

在这种情况下,不需要使用CAShapeLayer (因为您不能使用filters)。您可以从CGImage创建一个UIBezierPath (就像您正在做的那样;只需要stroke和/或fill路径,而不是调用renderInContext)。然后对结果使用apply CIFilter,创建一个CGImage并将其分配给contents。(从上面的代码中,您似乎了解如何做所有这些事情,所以我在这里不写它。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33384314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档