CoreImage CIColorClamp приспосабливается к неправильным значениям - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь использовать CIColorClamp для изображения, которое должно просто держать пиксели в пределах заданного диапазона (https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/uid/TP30000136-SW42)), но когда я печатаю результаты до и после на черном пикселе, он выдает цифры, отличные от установленных в параметрах. Вот код:

let ciImage = CIImage.init(cgImage: image.cgImage!)
let filter = CIFilter("CIColorClamp")!
filter.setDefaults()
filter.setValue(ciImage, forKey: kCIInputImageKey)
filter.setValue(CIVector(x: 0.8, y: 0.8, z: 0.8, w: 0), forKey: "inputMinComponents")
filter.setValue(CIVector(x: 1, y: 1, z: 1, w: 1), forKey: "inputMaxComponents")

let outputCIImage = filter.outputImage!
let context = CIContext.init()
let outputCGImage = context.createCGImage(outputCIImage, from: outputCIImage.extent)
let outputImage = UIImage(cgImage: outputCGImage, scale: image.scale, orientation: image.imageOrientation)

Это должно дать (0,8, 0,8, 0,8, 1) для черного пикселя (0, 0, 0, 1), но когда я его печатаю, это дает следующее:

<CIColorClamp: inputImage=<CIImage: 0x28165d590 extent [0 0 800 160]>
inputMinComponents=[0.8 0.8 0.8 0] inputMaxComponents=[1 1 1 1]>
BEFORE 0.0, 0.0, 0.0, 1.0
AFTER 0.9058823529411765, 0.9058823529411765, 0.9058823529411765, 1.0

CoreImage делает что-то еще, кроме мин / макс? Или я не знаю, что еще здесь может быть не так.

1 Ответ

1 голос
/ 27 мая 2019

Я думаю, это проблема соответствия цветов. Базовое изображение выполняет сопоставление цветов от ввода до работы для вывода цветового пространства по умолчанию. Если цветовое пространство вашего входного изображения отличается от выходного цветового пространства, вы можете получить другие значения пикселей.

Попробуйте настроить CIContext таким образом, чтобы вообще не подбирать цвета:

let context = CIContext(options: [.workingColorSpace: NSNull(), .outputColorSpace: NSNull()])

Для фильтра с цветным зажимом это может сработать, поскольку он просто фиксирует значения. Однако я не уверен, требует ли фильтр цветовой матрицы определенного цветового пространства.

Вы также можете выполнить быстрый просмотр outputCIImage в отладчике, чтобы увидеть график операций, которые Core Image фактически выполняет над образом.

...