iphone - 如何更改图像中的特定颜色?

标签 iphone objective-c image-processing core-graphics pixel

我的问题是,如果我有狮子图像,我只想更改狮子的颜色而不是背景颜色。为此,我提到了这个SO question但它改变了整个图像的颜色。而且图像看起来不太好。我需要像photoshop一样改变颜色。是否可以在 coregraphics 中执行此操作,或者我必须使用任何其他库。

编辑:我需要将颜色更改为 iQuikColor应用程序

enter image description here

最佳答案

这花了很长时间才弄清楚,主要是因为我想使用 Core Image 和 CIColorCube 在 Swift 中启动并运行它。

@Miguel 的解释非常准确地说明了如何将“色相角度范围”替换为另一个“色相角度范围”。您可以阅读他上面的文章,详细了解什么是色相角度范围。

我制作了一个快速应用程序,可以用您在色相 slider 上选择的任何内容替换下面默认的蓝色卡车。

enter image description here

您可以滑动 slider 来告诉应用程序您想要用什么颜色替换蓝色。

我将色相范围硬编码为 60 度,这通常似乎涵盖了大部分特定颜色,但如果需要,您可以对其进行编辑。

enter image description here

enter image description here

请注意,它不会为轮胎或尾灯着色,因为它们超出了卡车默认蓝色色调的 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)
    }
}

您可以下载sample project here .

关于iphone - 如何更改图像中的特定颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40941986/

相关文章:

ios - 从后台手动终止我的应用程序时抛出异常

iOS 8.3 Storyboard侧边菜单

python - 如何使用 Python 检测图像中的激光线

python - 将一个数组作为索引传递给另一个数组?

iphone - 在整个 xcode 项目中重构整个类名

iphone - 某些 iphone sip 应用程序使用什么技巧与 UDP only sip 服务器通信?

iphone - NSPredicate - 未按预期工作

ios - NSMutableDictionary isKindOfClass NSDictionary 为 false

python - Mac OS X 的系统级快捷方式

python - 根据 HSV 色调范围将选定像素转为黑色