从 ARGB 转换为 RGBA

Posted

技术标签:

【中文标题】从 ARGB 转换为 RGBA【英文标题】:Conversion from ARGB to RGBA 【发布时间】:2020-08-22 00:13:49 【问题描述】:

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

我有 2 个构造函数:

    分别获取 uint8_t 类型的 R、G、B、A 值 - 就像魅力一样工作。 采用一个具有 ARGB 值的 uint32_t - 问题从这里开始:我是 我有一种将提供的 ARGB 转换为 RGBA(“fromArgb”)的方法。 好像只有转换为 RGBA 颜色 Red 效果很好,其他颜色转换都无效。

例子:

红色 = 颜色(0xFFFF0000); // 效果很好(包含值: 十六进制:#FF0000FF; R:255,G:0,B:0,A:255)

绿色=颜色(0xFF008000); // 错误 - 实际上是粉红色 (包含值:十六进制:#008000FF R:255,G:0,B:128,A:0)

蓝色=颜色(0xFF0000FF); // 错误 - 实际上是黄色 (包含值:十六进制:#0000FFFF R:255,G:255,B:0,A:0)

黄色 = 颜色(0xFFFFFF00); // 错误 - 实际上是粉红色 (包含值:十六进制:#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;   
    

【问题讨论】:

你能澄清一下你用什么来实际显示新颜色吗?因为在我看来,该系统将您的 HEX 值解释为 ABGR 值。 当然,我正在使用 D3D11 (ClearRenderTargetView)。正如约翰所说,你是对的,这确实是问题所在。谢谢! 【参考方案1】:

在我看来,该类持有 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 
    

【讨论】:

以上是关于从 ARGB 转换为 RGBA的主要内容,如果未能解决你的问题,请参考以下文章

保存的 Gdiplus::Bitmap 始终具有 Alpha 通道 (RGBA/ARGB)

Android 必知必会 - RGBA转ARGB

我无法让 vImage(加速框架)将 420Yp8_Cb8_Cr8(平面)转换为 ARGB8888

将 int 颜色转换为 argb

NEON:如何将 128 位 ARGB 转换为具有饱和度的 32 位 ARGB?

对于IOS,如何使用vImage将ARGB图像转换为灰度图像