Swift CIColorCube заменяет цвета - PullRequest
0 голосов
/ 20 марта 2020

Я использую ответ в " Как изменить определенный цвет на изображении? ", чтобы изменить два цвета в моем изображении на два других цвета. Это прекрасно работает, если цвета на моих изображениях похожи на зеленый и синий, но я должен использовать следующие цвета:

- #BBBBBB (hsla(0, 0%, 73%, 1))
- #FFFFFF (hsla(0, 100%, 100%, 1))

Как проверить, совпадает ли диапазон моих цветов, если оттенок в принципе может быть между 0 и 360. Нужно ли сравнивать насыщенность и свет также? Или я сравниваю цвета по-другому?

Код у меня сейчас такой:

image.colorize {
    let hsv = UIColor.hsv($0, $1, $2)

    // Do some range checks for my two colors here set the colors if needed
}

extension UIImage {
    func colorize(transform: (inout Float, inout Float, inout Float, inout Float) -> Void) -> UIImage? {
        guard let ciImage = CIImage(image: self) else {
            return nil
        }

        let size = 64
        let cubeDataSize = size * size * size * 4
        guard let cubeData = NSMutableData(capacity: cubeDataSize * MemoryLayout<Float>.size) else {
            return nil
        }

        for z in 0..<size {
            let blue = Float(z) / Float(size - 1)
            for y in 0..<size {
                let green = Float(y) / Float(size - 1)
                for x in 0..<size {
                    let red = Float(x) / Float(size - 1)

                    var premultipliedRed = red
                    var premultipliedGreen = green
                    var premultipliedBlue = blue
                    var alpha = Float(0)

                    transform(&premultipliedRed, &premultipliedGreen, &premultipliedBlue, &alpha)

                    cubeData.append(&premultipliedRed, length: MemoryLayout<Float>.size)
                    cubeData.append(&premultipliedGreen, length: MemoryLayout<Float>.size)
                    cubeData.append(&premultipliedBlue, length: MemoryLayout<Float>.size)
                    cubeData.append(&alpha, length: MemoryLayout<Float>.size)
                }
            }
        }

        guard let filter = CIFilter(name: "CIColorCube", parameters: [
            "inputImage": ciImage,
            "inputCubeDimension": NSNumber(value: size),
            "inputCubeData": cubeData
        ]) else {
            return nil
        }

        guard let outputImage = filter.outputImage else {
            return nil
        }

        return UIImage(ciImage: outputImage)
    }
}

extension UIColor {
    static func hsv(_ red: Float,
                    _ green: Float,
                    _ blue: Float) -> (Float, Float, Float) {
        let color = UIColor(red: CGFloat(red),
                            green: CGFloat(green),
                            blue: CGFloat(blue),
                            alpha: 1)

        var hue: CGFloat = 0
        var sat: CGFloat = 0
        var brightness: CGFloat = 0
        color.getHue(&hue, saturation: &sat, brightness: &brightness, alpha: nil)

        return (Float(hue), Float(sat), Float(brightness))
    }
}
...