Как применить оттенок цвета к UIImage, используя Core Image - PullRequest
0 голосов
/ 21 декабря 2018

Я ищу решение применить цветовой оттенок к изображению без изменения разрешения и размера.Я создаю пользовательские фильтры, используя значения RGB и CIColorControls.Я могу применять различные цветовые элементы управления (например, яркость, контрастность и насыщенность).

У меня есть значения, Контраст, Яркость, Насыщенность как (110%., 110%, 130%) И я применил ихработает нормально.Это мой код:

func applyCustomValues(image: UIImage, brightness: Double, contrast: Double, saturation: Double) -> UIImage{

    let beginImage = CIImage(cgImage: image.cgImage!)
    let parameters = [
        "inputContrast": NSNumber(value: contrast),
        "inputBrightness": NSNumber(value: brightness),
        "inputSaturation": NSNumber(value: saturation),
        ]
    let outputImage = beginImage.applyingFilter("CIColorControls", parameters: parameters)

    let context = CIContext(options: nil)

    let outputCGImage = context.createCGImage(outputImage, from: outputImage.extent)

    return UIImage(cgImage: outputCGImage)
}

И значения RGB у меня R = 243, G = 106, B = 188.

Я хотел бы применить все эти значения на изображениии ожидаемый результат как подобное требование

Чтобы применить цвет оттенка (RGB) Это мой код:

func tint(image: UIImage, color: UIColor) -> UIImage
{
    let ciImage = CIImage(image: image)
    let filter = CIFilter(name: "CIMultiplyCompositing")
    filter?.setDefaults()

    let colorFilter = CIFilter(name: "CIConstantColorGenerator")
    let ciColor = CIColor(color: color)
    colorFilter?.setValue(ciColor, forKey: kCIInputColorKey)
    let colorImage = colorFilter?.outputImage

    filter?.setValue(colorImage, forKey: kCIInputImageKey)
    filter?.setValue(ciImage, forKey: kCIInputBackgroundImageKey)
    let context = CIContext(options: nil)
    let cgImage = context.createCGImage(filter!.outputImage!, from: (ciImage?.extent)!)
    return UIImage(cgImage: cgImage!)
}

Чтобы применить Tint и CIColorControls,

   let tintImage = tint(image:orinalImage, color: UIColor.getTintColor(r: 255/255, g: 131/255, b: 0/255, alpha: 1))

   let colorControlImage = applyCustomValues(image: tintImage, brightness: 0.11, contrast: 1.10, saturation: 1.3)

Возвращает выходное изображение, приведенное ниже:

enter image description here

Исходное изображение:

enter image description here

ожидаемое изображение на выходе Please ignore the scale of image Пожалуйста, не обращайте внимания на масштаб изображения

Пожалуйста, исправьте меня, если я ошибаюсь, как правильно добиться этого.

1 Ответ

0 голосов
/ 08 января 2019

Наконец-то я получил ответ, что хотел, пусть он кому-нибудь поможет.

func colorized(with color: UIColor) -> UIImage? {
    guard
        let ciimage = CIImage(image: self),
        let colorMatrix = CIFilter(name: "CIColorMatrix")
        else { return nil }
    var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
    color.getRed(&r, green: &g, blue: &b, alpha: &a)
    colorMatrix.setDefaults()
    colorMatrix.setValue(ciimage, forKey: "inputImage")
    colorMatrix.setValue(CIVector(x: r, y: 0, z: 0, w: 0), forKey: "inputRVector")
    colorMatrix.setValue(CIVector(x: 0, y: g, z: 0, w: 0), forKey: "inputGVector")
    colorMatrix.setValue(CIVector(x: 0, y: 0, z: b, w: 0), forKey: "inputBVector")
    colorMatrix.setValue(CIVector(x: 0, y: 0, z: 0, w: a), forKey: "inputAVector")
    if let ciimage = colorMatrix.outputImage {
        return UIImage(ciImage: ciimage)
    }
    return nil
}
...