向 CIImage 添加过滤器
Adding filters to CIImage
我创建了一个处理图像的应用程序,但遇到了问题。我无法为照片添加滤镜,我不知道如何解决这个问题。
我自己编写了 class 用于 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)
}
但是当我更改亮度、对比度和饱和度的值时,没有任何反应。图片保持静止。为什么会这样?
首先,看一下 CIImage.applyingFilter 的方法签名。它不是一种变异方法;它 returns 一个新的 CIImage。其次,CIImage 的工作方式是它基本上存储图像 + 滤镜的着色器指令。它实际上不会编译和执行着色器,直到您隐式地(例如通过转换为 UIImage)或显式地创建 CIContext。我不知道你是否在这样做,因为我看不到你的代码。在任何情况下,您都应该有一个过滤器链,其输入由您的参数控制。然后,您只需在更改任何参数时重新评估过滤器。
我创建了一个处理图像的应用程序,但遇到了问题。我无法为照片添加滤镜,我不知道如何解决这个问题。
我自己编写了 class 用于 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)
}
但是当我更改亮度、对比度和饱和度的值时,没有任何反应。图片保持静止。为什么会这样?
首先,看一下 CIImage.applyingFilter 的方法签名。它不是一种变异方法;它 returns 一个新的 CIImage。其次,CIImage 的工作方式是它基本上存储图像 + 滤镜的着色器指令。它实际上不会编译和执行着色器,直到您隐式地(例如通过转换为 UIImage)或显式地创建 CIContext。我不知道你是否在这样做,因为我看不到你的代码。在任何情况下,您都应该有一个过滤器链,其输入由您的参数控制。然后,您只需在更改任何参数时重新评估过滤器。