Есть ли способ получить информацию о формате пикселей из vImage_Buffer в Swift? - PullRequest
1 голос
/ 11 марта 2020

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

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

Но проблема в том, что я не знаю, как получить пиксельный формат (ARGB? RGBA? BGRA? ...) из существующего vImage_Buffer. Даже документ говорит, что vImage_Buffer не описывает сам формат пикселя.

Любая идея?

1 Ответ

4 голосов
/ 23 марта 2020

vImage_Buffer описывает только прямоугольный массив angular данных пикселей. Тип данных (unorm8, float и т. Д. c.) Определяется по имени функции, которая над ним работает. Это все должно быть достаточно ясно.

С точки зрения vImage, порядок каналов - то, что вы говорите. Для большинства функций vImage порядок каналов не имеет значения, поскольку все каналы обрабатываются одинаково. Их можно назвать _ARGB8888, но на самом деле они _XXXX8888. Для других функций vImage (например, PremultiplyData) только один канал обрабатывается по-разному. В этом случае важно, чтобы альфа-канал появлялся либо в первом, либо в последнем канале, как описано в имени функции. Порядок других каналов не имеет значения, потому что они обрабатываются одинаково. Для конкретной функции, о которой вы говорите, ваша задача - определить порядок красного, зеленого и синего каналов и соответствующим образом настроить порядок матрицы коэффициентов.

Возможно, порядок каналов в ваших данных установлен в зависимости от того, что произвело ваши данные изображения в первую очередь. Часто это CoreGraphics / ImageIO. В этом случае - это немного сложно - порядок цветовых каналов совпадает с порядком цветов в цветовом пространстве CGImageRef. Альфа идет первым или последним (если присутствует) на основе информации о битовой карте CGImage, частью которой является CGImageAlphaInfo. Как последнее осложнение, все это может быть подвергнуто 16- или 32-битному преобразованию порядка байтов. Если размер канала меньше, чем квант преобразования с порядком байтов (16- или 32-битный), то порядок каналов относительно друг друга меняется местами в соответствии с преобразованием байтов. Самым распространенным случаем этого являются данные BGRA unorm8, которые кодируются как 8-разрядные данные ARGB с помеченным 32-разрядным преобразованием с прямым порядком байтов. Тем не менее, возможно, что можно получить 16-битные альфа-данные в каждом канале серого с порядком GA, транспонированным из-за 32-битного преобразования порядка байтов, который будет одновременно менять G и A относительно друг друга и преобразовывать 16-битные выборки в 16-разрядный байтовый код (Обратите внимание, что это, вероятно, никогда не происходит в природе, так как вы могли бы более четко классифицировать это как альфа сначала с помощью 16-битного преобразования с прямым порядком байтов. Хотя кодировка допустима.)

Есть несколько примеров в vImage_Utilities .h C заголовки (не уверены в быстрой версии), которые показывают примеры распространенных кодировок CG.

...