Я использую ответ в " Как изменить определенный цвет на изображении? ", чтобы изменить два цвета в моем изображении на два других цвета. Это прекрасно работает, если цвета на моих изображениях похожи на зеленый и синий, но я должен использовать следующие цвета:
- #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))
}
}