从ARGB转换为RGBA

Conversion from ARGB to RGBA

本文关键字:RGBA 转换 ARGB      更新时间:2024-05-23

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

我有两个建设者:

  1. 分别获取uint8_t类型的R、G、B、A值-工作方式类似于符咒
  2. 获取一个uint32_t,该uint32_t包含ARGB值-问题从这里开始:我有一个方法可以将提供的ARGB转换为RGBA("fromArgb"(。似乎只有转换为RGBA颜色红色效果良好,所有其他颜色转换都无效

示例:

  • 颜色红色=颜色(0xFFFF0000(//运行良好(包含以下值:十六进制:#FF0000FF;R: 255,G:0,B:0,A:255(

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

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

  • Color yellow=颜色(0xFFFFFF00(//错误-实际上是Pinkish颜色(包含值:十六进制:#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;   
}

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