Как визуализировать CIImage с индексированным цветовым пространством в UIImageView?

Я пытаюсь преобразовать изображение, поступающее из видеопотока (CVImageBuffer), в заданный набор предопределенных цветов. Ниже я сначала преобразовываю поток в CIImage с индексированным цветовым пространством, затем преобразовываю CIImage в UIImage, но это окончательное преобразование дает следующую ошибку: [render] Could not support source colorspace: Indexed Colorspace 0x281608ba0.

Любая идея о том, как получить этот эффект (например, эффект Posterize, но с определенными цветами)?

let palette: [UInt8] = [
    0, 0, 0,
    0, 0, 255
    0, 255, 0,
    255, 0, 0,
    255, 255, 255]

let indexedColorSpace = CGColorSpace(indexedBaseSpace: CGColorSpaceCreateDeviceRGB(),
                                     last: palette.count - 1,
                                     colorTable: palette)!

let image = CIImage(cvImageBuffer: videoPixelBuffer,
                    options: [CIImageOption.colorSpace: indexedColorSpace])

let context = CIContext()
let cgImage = context.createCGImage(image, from: image.extent)!

indexedImageView.image = UIImage(cgImage: cgImage)

[РЕДАКТИРОВАТЬ]

После матового комментария, я добавил рендеринг через CIContext, но все равно получаю ту же ошибку цветового пространства…


person jdanthinne    schedule 25.04.2020    source источник
comment
Проблема заключается в этой строке: indexedImageView.image = UIImage(ciImage: image) Вы не можете просто обернуть CIImage в UIImage и отобразить его в представлении изображения. Сначала вы должны фактически преобразовать CIImage в настоящий UIImage. Либо так, либо отображайте CIImage напрямую с помощью Metal.   -  person matt    schedule 25.04.2020