这花了很长时间才弄清楚,主要是因为我想使用Core Image和CIColorCube在Swift中启动并运行它。
@Miguel的解释是关于需要用另一个“色相角范围”替换“色相角范围”的方式的。您可以在上方阅读他的文章,详细了解“色相角度范围”。
我制作了一个快速应用程序,用您在“色相”滑块上选择的任何内容替换了下面的默认蓝色卡车。
您可以滑动滑块以告知应用您要用哪种颜色替换蓝色。
我将色相范围硬编码为60度,通常似乎涵盖了大多数特定颜色,但是您可以根据需要进行编辑。
请注意,它不会为轮胎或尾灯着色,因为它不在卡车默认蓝色色调的60度范围内,但可以正确处理阴影。
首先,您需要将RGB转换为HSV(色相值)的代码:
func RGBtoHSV(r : Float, g : Float, b : Float) -> (h : Float, s : Float, v : Float) {
var h : CGFloat = 0
var s : CGFloat = 0
var v : CGFloat = 0
let col = UIColor(red: CGFloat(r), green: CGFloat(g), blue: CGFloat(b), alpha: 1.0)
col.getHue(&h, saturation: &s, brightness: &v, alpha: nil)
return (Float(h), Float(s), Float(v))
}
然后,您需要将HSV转换为RGB。当您发现所需色相范围内的色相(也就是与默认卡车的蓝色相仿的颜色)时,可以使用此功能来节省所做的任何调整。
func HSVtoRGB(h : Float, s : Float, v : Float) -> (r : Float, g : Float, b : Float) {
var r : Float = 0
var g : Float = 0
var b : Float = 0
let C = s * v
let HS = h * 6.0
let X = C * (1.0 - fabsf(fmodf(HS, 2.0) - 1.0))
if (HS >= 0 && HS < 1) {
r = C
g = X
b = 0
} else if (HS >= 1 && HS < 2) {
r = X
g = C
b = 0
} else if (HS >= 2 && HS < 3) {
r = 0
g = C
b = X
} else if (HS >= 3 && HS < 4) {
r = 0
g = X
b = C
} else if (HS >= 4 && HS < 5) {
r = X
g = 0
b = C
} else if (HS >= 5 && HS < 6) {
r = C
g = 0
b = X
}
let m = v - C
r += m
g += m
b += m
return (r, g, b)
}
现在,您只需遍历完整的RGBA颜色立方体,即可将“默认蓝色”色调范围内的任何颜色与您新希望的色相“调整”在一起。然后,使用Core Image和CIColorCube过滤器将调整后的颜色立方体应用于图像。
func render() {
let centerHueAngle: Float = 214.0/360.0 //default color of truck body blue
let destCenterHueAngle: Float = slider.value
let minHueAngle: Float = (214.0 - 60.0/2.0) / 360 //60 degree range = +30 -30
let maxHueAngle: Float = (214.0 + 60.0/2.0) / 360
var hueAdjustment = centerHueAngle - destCenterHueAngle
let size = 64
var cubeData = [Float](count: size * size * size * 4, repeatedValue: 0)
var rgb: [Float] = [0, 0, 0]
var hsv: (h : Float, s : Float, v : Float)
var newRGB: (r : Float, g : Float, b : Float)
var offset = 0
for var z = 0; z < size; z++ {
rgb[2] = Float(z) / Float(size) // blue value
for var y = 0; y < size; y++ {
rgb[1] = Float(y) / Float(size) // green value
for var x = 0; x < size; x++ {
rgb[0] = Float(x) / Float(size) // red value
hsv = RGBtoHSV(rgb[0], g: rgb[1], b: rgb[2])
if hsv.h < minHueAngle || hsv.h > maxHueAngle {
newRGB.r = rgb[0]
newRGB.g = rgb[1]
newRGB.b = rgb[2]
} else {
hsv.h = destCenterHueAngle == 1 ? 0 : hsv.h - hueAdjustment //force red if slider angle is 360
newRGB = HSVtoRGB(hsv.h, s:hsv.s, v:hsv.v)
}
cubeData[offset] = newRGB.r
cubeData[offset+1] = newRGB.g
cubeData[offset+2] = newRGB.b
cubeData[offset+3] = 1.0
offset += 4
}
}
}
let data = NSData(bytes: cubeData, length: cubeData.count * sizeof(Float))
let colorCube = CIFilter(name: "CIColorCube")!
colorCube.setValue(size, forKey: "inputCubeDimension")
colorCube.setValue(data, forKey: "inputCubeData")
colorCube.setValue(ciImage, forKey: kCIInputImageKey)
if let outImage = colorCube.outputImage {
let context = CIContext(options: nil)
let outputImageRef = context.createCGImage(outImage, fromRect: outImage.extent)
imageView.image = UIImage(CGImage: outputImageRef)
}
}
0
我的问题是,如果我有狮子图像,只想改变狮子的颜色而不是背景颜色。为此,我提到了这个问题,但它使整个图像变成彩色。此外,图像看起来不佳。我需要像photoshop一样的颜色更改。是否可以在核心图形中执行此操作,或者我必须使用任何其他库。
编辑:我需要更改颜色像iQuikColor应用程序