我想把CIFilter应用于CAShapeLayer.filters。这是否正确的假设:
要从CGImage创建CAShapeLayer,我使用了CAShapeLayer.contents,但在我的示例中,内容为零,而且如果将CAShapeLayer呈现给图像上下文,则无法获得图像。
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)
}
}发布于 2015-10-28 14:15:27
CALayer.filters不是在iOS上实现的。
在这种情况下,不需要使用CAShapeLayer (因为您不能使用filters)。您可以从CGImage创建一个UIBezierPath (就像您正在做的那样;只需要stroke和/或fill路径,而不是调用renderInContext)。然后对结果使用apply CIFilter,创建一个CGImage并将其分配给contents。(从上面的代码中,您似乎了解如何做所有这些事情,所以我在这里不写它。)
https://stackoverflow.com/questions/33384314
复制相似问题