как покрасить маску в с - PullRequest
0 голосов
/ 30 марта 2011

как вы маскируете 32-битное целое число без знака для красного, зеленого и синего значений

это так? (color_to_be_masked >> 8)

Ответы [ 4 ]

2 голосов
/ 30 марта 2011

Это должно дать вам желаемый результат:

short red = (color >> 16) & 0xFF;
short green = (color >> 8) & 0xFF;
short blue = (color) & 0xFF;
0 голосов
/ 30 марта 2011

Если после этого вы преобразуетесь в char или uint8_t, это работает так, как вы сказали.

В противном случае вам также нужно добавить &0xff, иначе у вас также будут оставшиеся биты (для всех, кроме самого значимого цвета). Итак, что-то вроде (color >> multiple_of_8) &0xff.

Важная деталь: существует порядок компонентов RGBA и BGRA, а также разные порядковые номера на разных процессорах. Вы должны знать, какой из них вам нужен (например, Windows GDI - BGRA).

0 голосов
/ 30 марта 2011

Это зависит от формата. Если вы хотите сохранить только красный, а цвета хранятся в крошечной RGBA RRGGBBAA, то color & 0xFF000000 замаскирует все остальные цвета. Если вы хотите узнать значение красного для того же формата, (color >> 24) & 0xFF получит его.

0 голосов
/ 30 марта 2011

«Это зависит», а именно от того, какой бит какого цвета.

Часто они отображаются "в обратном направлении", так что красный находится в самых младших битах, зеленый - в "среднем", а синий - сверху (иногда за ним следует альфа, если он используется).

Предполагая 8 бит на компонент, вы получите:

uint32_t abgr = 0x80eeccaa;  /* Or whatever. */
const uint8_t red = abgr & 0xff;
const uint8_t green = (abgr >> 8) & 0xff;
const uint8_t blue = (abgr >> 16) & 0xff;
const uint8_t alpha = (abgr >> 24) & 0xff;

Если вы действительно используете порядок компонентов "rgba", поменяйте местами вышеприведенное:

uint32_t rgba = 0xaaccee80;  /* Or whatever. */
const uint8_t red = (abgr >> 24) & 0xff;
const uint8_t green = (abgr >> 16) & 0xff;
const uint8_t blue = (abgr >> 8) & 0xff;
const uint8_t alpha = abgr & 0xff;

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

...