Как мне сказать CIKernel для создания выходного изображения без альфа-канала?

Я написал собственное ядро ​​в Core Image:

outputImage = kernel.apply(extent: extent,
                           roiCallback: roiCallback,
                           arguments: [inputImage])!

static let kernel = CIKernel(source:"""
kernel vec4 process(sampler src) {
  vec4 pixel = sample(src, samplerTransform(destCoord()));
  return pixel;
}   
""")!

(Это простое неоперативное ядро ​​для иллюстрации, а не настоящее.)

Ввод BGRA, но я хочу, чтобы выходной CIImage был BGR (или RGB или любой другой порядок). Это возможно?

Причина, по которой я хочу сделать это, состоит в том, что все альфа-значения во входном изображении равны 1, поэтому я не хочу тратить память (и время обработки) на хранение миллионов единиц в выходном изображении, если бы я мог пропустить это. Мой код чувствителен к производительности и работает недостаточно быстро, поэтому я ищу способы его оптимизации.

В случае, если это имеет значение, я нацеливаюсь на iOS 11 и выше.


Я попытался изменить код на:

kernel vec3 process(sampler src) {
  vec3 pixel = sample(src, samplerTransform(destCoord())).xyz;
  return pixel;
}

но я получил ошибку:

invalid kernel return type; valid types are 'vec2' and 'vec4' 

Как указал II в ответе, vec3 не является допустимым типом возврата, поэтому эта идея не работает. Что тогда?

1 ответ

Согласно документации Apple, тип возвращаемого значения должен быть vec 4, но это не обязательно должен быть пиксель BGRA или даже пиксель:

Подпрограмма ядра вызывается один раз для каждого пикселя целевого изображения. Процедура должна возвращать тип данных vec4. Хотя этот четырехэлементный вектор обычно содержит данные пикселей, вектор не обязательно должен представлять пиксель

от: Написание ядра

Другие вопросы по тегам