Как распаковать цвет uint32_t в c ++ - PullRequest
0 голосов
/ 29 апреля 2020

В настоящее время у меня есть переменная uint32_t, в которой хранятся цвета rgb пикселя. Это выглядит так:

uint32_t colour = (255<<24) + (int(red)<<16) + (int(green)<<8) + int(blue);

где переменные красный, зеленый и синий - это значения до 255. Я хотел бы взять этот uint32_t и распаковать его, чтобы я мог выделить отдельные значения цвета. Затем я хотел бы сохранить эти отдельные значения в массиве

  color[0] = ; // red integer between 0 and 255
  color[1] = ; // green integer between 0 and 255
  color[2] = ; // blue integer between 0 and 255

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Вам нужно замаскировать соответствующие части, а затем сдвинуть их, чтобы они находились в правильном диапазоне.

Вот некоторый код:

constexpr uint32_t blue_offset{ 0x00 };
constexpr uint32_t green_offset{ 0x08 }; // 8 decimal
constexpr uint32_t red_offset{ 0x10 }; // 16 decimal
constexpr uint32_t alpha_offset{ 0x20 }; // 24 decimal

constexpr uint32_t byte_mask{ 0xFF };
constexpr uint32_t blue_mask{ byte_mask << blue_offset };
constexpr uint32_t green_mask{ byte_mask << green_offset };
constexpr uint32_t red_mask{ byte_mask << red_offset };
constexpr uint32_t alpha_mask{ byte_mask << alpha_offset };

color[0] = (colour & red_mask >> red_offset) & byte_mask;
color[1] = (colour & green_mask >> green_offset) & byte_mask;
color[2] = (colour & blue_mask >> blue_offset) & byte_mask;

См. это руководство за отличное объяснение. Ниже приведен пример с цветами RGB.

0 голосов
/ 29 апреля 2020

Распаковка может быть выполнена с помощью:

 color[0] = (colour >> 16) & 0xff; // red
 color[1] = (colour >> 8) & 0xff; // green
 color[2] = colour  & 0xff; // blue

Обратите внимание, что вы также можете использовать структуру для прямой распаковки, если вы знаете, что машина, на которой вы работаете, например,

int main()
{

    char red = 25;
    char green = 57;
    char blue = 23;

    unsigned int colour = (255<<24) + (int(red)<<16) + (int(green)<<8) + int(blue);

    struct s_rgb
    {
        unsigned int b:8;
        unsigned int g:8;
        unsigned int r:8;
        unsigned int alpha:8;
    };

    s_rgb rgb = *(s_rgb*)&colour;
    cout <<std::dec<< "r:"<< (int)rgb.r << " g:"<< (int)rgb.g << " b:"<< (int)rgb.b << endl;
}
...