繁体   English   中英

在UI元素上应用CIFilters

[英]Apply CIFilters on UI elements

我想在UI元素上应用CIFilter。 我试图通过.filters成员将其应用于视图层。 但是,过滤器不会被应用。

这是一种方法:使用UIGraphicsGetImageFromCurrentImageContext生成UIImage ,对其应用滤镜,然后将包含滤镜图像的图像视图覆盖在原始组件上。

这是一种模糊处理的方法( 摘自我的博客 ):

获得UIView的模糊表示非常简单:我需要开始一个图像上下文,使用视图层的renderInContext方法渲染到上下文中,然后从上下文中获取UIImage:

UIGraphicsBeginImageContextWithOptions(CGSize(width: frame.width, height: frame.height), false, 1)

layer.renderInContext(UIGraphicsGetCurrentContext()!)

let image = UIGraphicsGetImageFromCurrentImageContext()


UIGraphicsEndImageContext();

填充完图像后,对它应用高斯模糊是相当标准的工作流程:

guard let blur = CIFilter(name: "CIGaussianBlur") else
{
    return
}

blur.setValue(CIImage(image: image), forKey: kCIInputImageKey)
blur.setValue(blurRadius, forKey: kCIInputRadiusKey)

let ciContext  = CIContext(options: nil)

let result = blur.valueForKey(kCIOutputImageKey) as! CIImage!

let boundingRect = CGRect(x: -blurRadius * 4,
    y: -blurRadius * 4,
    width: frame.width + (blurRadius * 8),
    height: frame.height + (blurRadius * 8))

let cgImage = ciContext.createCGImage(result, fromRect: boundingRect)


let filteredImage = UIImage(CGImage: cgImage)

模糊图像将大于其输入图像,因此我需要明确说明createCGImage所需的大小。

下一步是将UIImageView添加到我的视图中,并隐藏所有其他视图。 我将UIImageView子类BlurOverlay以便在删除它时,可以确定不删除现有的UIImageView

let blurOverlay = BlurOverlay()
blurOverlay.frame = boundingRect

blurOverlay.image = filteredImage

subviews.forEach{ $0.hidden = true }


addSubview(blurOverlay)

关于去模糊,我想确保最后一个子视图是我的BlurOverlay之一,将其删除并取消隐藏现有视图:

func unBlur()
{
    if let blurOverlay = subviews.last as? BlurOverlay
    {
        blurOverlay.removeFromSuperview()

        subviews.forEach{ $0.hidden = false }
    }

}

最后,要查看UIView当前是否模糊,我只需要查看其最后一个子视图是否为BlurOverlay

var isBlurred: Bool
{
    return subviews.last is BlurOverlay
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM