【问题标题】:Adding filters to CIImage向 CIImage 添加过滤器
【发布时间】:2017-11-22 19:54:24
【问题描述】:

我创建了一个处理图像的应用程序,但遇到了问题。我无法为照片添加滤镜,也不知道如何解决这个问题。

我为使用 CIImage 编写了自己的类:

import CoreImage

typealias Filter = (CIImage) -> ()
typealias ParametersFilter = Dictionary<String, AnyObject>

public protocol PXImageDelegate {
   func updateImage(picker: PXImage)
}

public class PXImage: CIImage {

public var delegate: PXImageDelegate?

open var brightness: Float = 0 {
    willSet (value) {
        brightness = value
        brightness(value)(self)
        updateImage()
    }
}

open var contrast: Float = 1 {
    willSet (value) {
        contrast = value
        contrast(value)(self)
        updateImage()
    }
}

open var saturation: Float = 1 {
    willSet (value) {
        saturation = value
        saturation(value)(self)
        updateImage()
    }
}

private func brightness(_ value: Float) -> Filter {
    return { image in
        let parameters: ParametersFilter = [
            kCIInputBrightnessKey: value as AnyObject,
            kCIInputImageKey: image
        ]

        self.applyingFilter("CIColorControls", parameters: parameters)
    }
}

private func contrast(_ value: Float) -> Filter {
    return { image in
        let parameters: ParametersFilter = [
            kCIInputContrastKey: value as AnyObject,
            kCIInputImageKey: image
        ]

        self.applyingFilter("CIColorControls", parameters: parameters)
    }
}

private func saturation(_ value: Float) -> Filter {
    return { image in
        let parameters: ParametersFilter = [
            kCIInputSaturationKey: value as AnyObject,
            kCIInputImageKey: image
        ]

        self.applyingFilter("CIColorControls", parameters: parameters)
    }
}

func updateImage() {
    delegate?.updateImage(picker: self)
}

但是当我改变亮度、对比度和饱和度的值时,什么都没有发生。图片保持静止。为什么会这样?

【问题讨论】:

    标签: ios swift core-graphics ciimage


    【解决方案1】:

    首先,看一下CIImage.applyingFilter 的方法签名。它不是一种变异方法;它返回一个新的 CIImage。其次,CIImage 的工作方式是它基本上存储图像 + 过滤器的着色器指令。在您隐含(例如通过转换为 UIImage)或显式创建 CIContext 之前,它不会实际编译和执行着色器。我不知道你是否这样做,因为我看不到你的代码。无论如何,您应该拥有一系列过滤器,其输入由您的参数控制。然后,您只需在更改任何参数时重新评估过滤器。

    【讨论】:

    • 感谢您的回复!我正在使用 CIContext 在 GLKView 中绘制此图像。
    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2014-10-26
    • 2015-01-22
    • 2018-02-17
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多