【问题标题】:Unable to Decrease CIVignette effect using UISlider无法使用 UISlider 降低 CIVignette 效果
【发布时间】:2017-10-10 06:40:55
【问题描述】:

我为我的照片编辑应用程序使用了CIVignette 效果。它基于 Slider 的变化事件应用。我使用了以下代码,我的问题是每当我增加滑块的值时出现晕影效果,但每当我降低滑块的值时,晕影效果不会降低。
请帮忙。

@IBAction func slider(_ sender: UISlider) {

        let startImage = CIImage(image: imgEdited!)!

        let vignetteFilter = CIFilter(name: "CIVignette")!

        let radius = 5

        vignetteFilter.setValue(startImage, forKey:kCIInputImageKey)
        vignetteFilter.setValue(sender.value, forKey:"inputIntensity")
        vignetteFilter.setValue(radius, forKey:"inputRadius")

        let filteredImageData = vignetteFilter.value(forKey: kCIOutputImageKey) as! CIImage
        let filteredImageRef = self.context.createCGImage(filteredImageData, from: filteredImageData.extent)

        imgImage.image = UIImage.init(cgImage: filteredImageRef!)
        self.imgEdited = imgImage.image
}

【问题讨论】:

    标签: ios swift3 core-image cifilter


    【解决方案1】:

    以下代码基于我对其他SO 帖子Blur effect using slider Is not working properly 的回答。

     @IBAction func slider(_ sender: UISlider) {
    
        let startImage = CIImage(image: UIImage(named: "Your Image Name")!) // You should initialise your UIImage here not UIImageView
        let vignetteFilter = CIFilter(name: "CIVignette")! 
    
        vignetteFilter.setValue(startImage, forKey:kCIInputImageKey)
        vignetteFilter.setValue(sender.value, forKey:kCIInputIntensityKey)
        vignetteFilter.setValue(5, forKey:kCIInputRadiusKey)
    
        let filteredImageData = vignetteFilter.value(forKey: kCIOutputImageKey) as! CIImage
        let filteredImageRef = self.context.createCGImage(filteredImageData, from: filteredImageData.extent)
    
        self.imgView.image = UIImage.init(cgImage: filteredImageRef!) // Output
    
     }
    

    模拟市民的输出:

    【讨论】:

    • 这个效果好吗?为什么不使用GLKView 和单个CIContext?这样您就可以使用 GPU,并且可以在 GLKView 中呈现 current CIImage,并在共享/保存时输出UIImage。我猜你会看到 5-10 倍的性能提升。 (当然,在模拟器中,您会看到几乎相同或更多的减少。但尽可能利用这些 GPU。)
    • 感谢您的评论@dfd。但是,SO 在另一篇相关帖子中指出他没有使用GLKView
    • 谢谢。仍然 - 表现如何?我发现动态地使用滑块来改变CIFilter 并创建UIImage 是......非常口吃。从我在您的输出示例中看到的情况来看,这里就是这种情况。
    • 它在真实设备@dfd 上运行良好,因为你知道 coreImage 在模拟器上的渲染总是很慢...
    • @dfd 刚刚在GLKView 上测试过,Memory consumption, CPU usage and Energy impact 似乎与我在模拟器和真实设备上发布的答案几乎相同。但是,我注意到GLKViewUISlider 滚动时平滑渲染。谢谢...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多