Как преобразовать CIImage в 32-битный буфер пикселей с плавающей запятой на канал?

Я хочу преобразовать CIImage в пиксельный буфер типа kCVPixelFormatType_128RGBAFloat. Но CIContext.render() не сообщает «неподдерживаемый формат». Я тестировал на iPhone 7 Plus под управлением iOS 11.

Вот мой код:

let context = CIContext()
var buffer: CVPixelBuffer? = nil
let buffer = CVPixelBufferCreate(nil,
                                 width,
                                 height,
                                 kCVPixelFormatType_128RGBAFloat,
                                 nil,
                                 &buffer)
assert(buffer != nil, "Couldn't create buffer")
context.render(ciImage, to: buffer)

Буфер создан успешно — утверждение не срабатывает. Только рендеринг в последней строке не говорит «неподдерживаемый формат».

Я также попытался создать CVPixelBuffer на базе IOSurface, заменив второй ноль с [kCVPixelBufferIOSurfacePropertiesKey: [:]] as CFDictionary, но это не помогло.

Как заставить это работать?

Формат должен быть kCVPixelFormatType_128RGBAFloat по причинам, которые слишком сложны, чтобы вдаваться в них, краткая версия заключается в том, что значения пикселей имеют больший диапазон, чем 0–255, включая дробные значения, которые нельзя округлить.

Я попробовал еще несколько вещей:

Ни один из них не работал. Рендеринг в 32-битные числа с плавающей запятой на канал или 16-битные целые числа на канал не поддерживается Core Image?


person Kartick Vaddadi    schedule 06.12.2017    source источник


Ответы (1)


Если 16 бит на канал достаточно, вы можете выполнить рендеринг с помощью kCVPixelFormatType_64RGBAHalf.

person gemedet    schedule 07.01.2018