Нестандартная проблема цвета фильтра 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?
1 ответ
Я думаю, это потому, что ядро создает цвета на основе кривой sRGB, а вы ожидаете цвета на основе линейных значений. Вы можете изменить вывод вашего фильтра на:
return colorKernel!.applyWithExtent(rect, arguments: nil)?
.imageByApplyingFilter("CISRGBToneCurveToLinear", withInputParameters: nil)
исправить выходной цвет. Кстати, каналы UInt8
, таким образом, значения являются целыми числами, а значение наполовину красного цвета равно 127.