Я хочу преобразовать 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, включая дробные значения, которые нельзя округлить.
Я попробовал еще несколько вещей:
- kCVPixelFormatType_64ARGB
- программный рендерер
- Создание CIContext на основе EAGLContext
- Создание CIContext с поддержкой MTLDevice
- Вызов CIContext.createCGImage()
- Рендеринг в MTLTexture, но я не мог понять, как его создать.
- Рендеринг на IOSurface
- Вызов clearCaches() в CIContext().
- Вызов reclaimResources(), но он недоступен в iOS.
- Проверка того, что мой ввод соответствует ‹ CIContext.inputImageMaximumSize() и outputImageMaximumSize()
- рендеринга в необработанный массив байтов.
Ни один из них не работал. Рендеринг в 32-битные числа с плавающей запятой на канал или 16-битные целые числа на канал не поддерживается Core Image?