我制作了一个自定义的 CIColorCube 滤镜,将预定灰色阴影(均匀间隔,包括黑色和白色)的图像变成彩色图像,每个阴影变成不同的色调。 问题是 - 它要么不提供任何输出,要么返回完全不变的图像。 这是过滤器的代码:
class GreyToColoutrsFilterMaker{
static let FilterHaver = GreyToColoutrsFilterMaker()
let filter: CIFilter?
private init() {
let size = Constants.SHADES_COUNT
var cubeRGB = [Float]()
for _ in 0 ..< size {
for _ in 0 ..< size {
for x in 0 ..< size {
let red = CGFloat(x) / CGFloat(size-1)
let hue = (1 - red) * 240 / 360
let destColor = UIColor(hue: hue, saturation: 1, brightness: 1, alpha: 1)
let colorParts = destColor.rgba
cubeRGB.append(Float(colorParts.red))
cubeRGB.append(Float(colorParts.green))
cubeRGB.append(Float(colorParts.blue))
cubeRGB.append(Float(colorParts.alpha))
}
}
}
let data = withUnsafeBytes(of: cubeRGB) { Data($0) }
filter = CIFilter(name: "CIColorCube", parameters: ["inputCubeDimension": size, "inputCubeData": data])
}
这是我在 UIImage img 上使用它的方式:
if let filter = GreyToColoutrsFilterMaker.FilterHaver.filter{
let ciImg = CIImage(image: img)
filter.setDefaults()
filter.setValue(ciImg, forKey: kCIInputImageKey)
if let filteredImageData = filter.outputImage{
let ciContext = CIContext(options: nil)
if let filteredImageRef = ciContext.createCGImage(filteredImageData, from: filteredImageData.extent){
img = UIImage(cgImage: filteredImageRef)
}
}
}
如果去掉“filter.setDefaults()”这一行,那么“if let filteredImageData = filter.outputImage”里面的代码不会执行,说明filter没有返回任何数据。但是如果使用线条,则过滤器不会以任何方式改变图像。