从 ARGB 到 RGBA 的转换

Conversion from ARGB to RGBA

我正在尝试为我的任务编写自己的 Color 结构。 我的目标是我的缓冲区将始终包含一个 RGBA 值,即使它是用 ARGB 值初始化的。

我有 2 个构造函数:

  1. 单独获取 uint8_t 类型的 R、G、B、A 值 - 非常有效。
  2. 接受一个 uint32_t 并持有一个 ARGB 值 - 问题从这里开始:我是 我有一种方法可以将提供的 ARGB 转换为 RGBA ("fromArgb")。 似乎只有转换到 RGBA 颜色 Red 效果很好,所有其他颜色转换都无效。

示例:

我好像找不到问题。 我很高兴能得到社区的一些支持!

示例源代码:

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;   
    }

在我看来 class 有一个 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 
    }