Преобразование из ARGB в RGBA - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь написать свою собственную структуру Color для моей задачи. Моя цель состоит в том, чтобы мой буфер всегда содержал значение RGBA, даже если он инициализирован значениями ARGB.

У меня есть 2 конструктора:

  1. Принимает R, G, B, A значения типа uint8_t отдельно - работает как шарм.
  2. Принимает uint32_t, который содержит значение ARGB - Проблема начинается здесь: у меня есть метод, который преобразует предоставленный ARGB в RGBA ("fromArgb"). Похоже, что только преобразование в цвет RGBA Красный работает хорошо, а все остальные преобразования цвета недействительны.

Примеры:

  • Красный цвет = Цвет (0xFFFF0000); // Хорошо работает (Содержит значения: Hex: # FF0000FF; R: 255, G: 0, B: 0, A: 255)

  • Цвет зеленый = Цвет (0xFF008000); // Неправильно - на самом деле Pinki sh цвет (Содержит значения: Hex: # 008000FF R: 255, G: 0, B: 128, A: 0)

  • Синий цвет = Цвет (0xFF0000FF); // Неправильно - на самом деле желтый sh цвет (Содержит значения: Hex: # 0000FFFF R: 255, G: 255, B: 0, A: 0)

  • Желтый цвет = Цвет (0xFFFFFF00); // Неправильно - на самом деле Pinki sh цвет (Содержит значения: Hex: # FFFF00FF R: 255, G: 0, B: 255, A: 255)

Кажется, я не могу найти проблему. Я буду более чем рад получить поддержку от сообщества!

Пример исходного кода:

struct Color
{
        public: 
        /* Works fine!!! */
        Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255)
        {
          buffer((r << 0) | (g << 8) | (b << 16) | (a << 24))
        } 

        Color(const uint32_t argb)
        {
          buffer = fromArgb(argb);
        }


        inline uint32_t fromArgb(uint32_t argb)
        {
            return
                // Source is in format: 0xAARRGGBB
                ((argb & 0x00FF0000) << 8)  | //RR______
                ((argb & 0x0000FF00) << 8)  | //__GG____
                ((argb & 0x000000FF) << 8)  | //____BB__
                ((argb & 0xFF000000) >> 24);  //______AA
                // Return value is in format:  0xRRGGBBAA
        }

        inline uint8_t getRed(void) const
        {
            return (buffer >> 0) & 0xFF;
        }

        inline uint8_t getGreen(void) const
        {
            return (buffer >> 8) & 0xFF;
        }

        inline uint8_t getBlue(void) const
        {
            return (buffer >> 16) & 0xFF;
        }

        inline uint8_t getAlpha(void) const
        {
            return (buffer >> 24) & 0xFF;
        }

        /* Works fine!!!*/
        std::string getHex(void) const
        {   
            std::string result    = "#";
            char colorBuffer[255] = {};

            // Order is intentionally end to beginning
            sprintf_s(colorBuffer, 255, "%.2X", getAlpha());
            result.append(colorBuffer);

            sprintf_s(colorBuffer, 255, "%.2X", getBlue());
            result.append(colorBuffer);

            sprintf_s(colorBuffer, 255, "%.2X", getGreen());
            result.append(colorBuffer);

            sprintf_s(colorBuffer, 255, "%.2X", getRed());
            result.append(colorBuffer);

            return result;
        }

        private:
         uint32_t buffer;   
    }

1 Ответ

2 голосов
/ 07 мая 2020

Мне кажется, что класс содержит значение ABGR, поэтому очевидно, что преобразование из ARGB в RGBA бесполезно. Это кажется правильным (хотя и не проверено).

    inline uint32_t fromArgb(uint32_t argb)
    {
        return
            // Source is in format: 0xAARRGGBB
            ((argb & 0x00FF0000) >> 16)  | //______RR
            ((argb & 0x0000FF00))        | //____GG__
            ((argb & 0x000000FF) << 16)  | /___BB____
            ((argb & 0xFF000000));         //AA______
            // Return value is in format:  0xAABBGGRR 
    }
...