Проблема с цветом фильтра Custom Core Image

Я учусь писать собственные фильтры Core Image, но у меня возникла проблема, когда отображаемый цвет не совпадает с указанным в коде ядра, когда значение цвета находится в диапазоне от 0 до 1. (Цвет правильный, если он равен 0 или 1.)

Это мой код фильтра:

import UIKit
class testFilter: CIFilter
{   
    // simply return half red color (0.5)

    var colorKernel = CIColorKernel(string:
        "kernel vec4 theFilter()" +
        "{ return vec4(0.5, 0.0, 0.0, 1.0); }"
    )

    override var outputImage: CIImage!
    { 
        let rect = CGRect(x: 0, y: 0, width: 200, height: 100)
        return colorKernel.applyWithExtent(rect,arguments: nil)
    }
}

Использование:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // generate image
        let filter = testFilter()
        let ciImage = f.outputImage      
        let image = UIImage(CIImage: ciImage) 

        // add to view
        let v = UIImageView(frame: CGRect(x: 50, y: 50, width: 200, height: 100))
        v.image = image     
        view.addSubview(v)
    }
}

Выходное изображение выглядит так, фактическое значение красного компонента составляет около 190 (я проверил значение цвета с помощью Photoshop). Для значения 0,5 я думал, что правильное выходное значение будет 255 * 0,5 = 122,5?

выходное изображение


person Zhe Dang    schedule 24.06.2016    source источник


Ответы (1)


Я думаю, это связано с тем, что ядро ​​создает цвета на основе кривой sRGB, а вы ожидаете, что цвета будут основаны на линейных значениях. Вы можете изменить вывод вашего фильтра на:

return colorKernel!.applyWithExtent(rect, arguments: nil)?
                   .imageByApplyingFilter("CISRGBToneCurveToLinear", withInputParameters: nil)

чтобы исправить выходной цвет. Между прочим, каналов UInt8, поэтому значения - целые числа, а значение половины красного равно 127.

person Simon Gladman    schedule 24.06.2016