从 ARGB 到 RGBA 的转换
Conversion from ARGB to RGBA
我正在尝试为我的任务编写自己的 Color 结构。
我的目标是我的缓冲区将始终包含一个 RGBA 值,即使它是用 ARGB 值初始化的。
我有 2 个构造函数:
- 单独获取 uint8_t 类型的 R、G、B、A 值 - 非常有效。
- 接受一个 uint32_t 并持有一个 ARGB 值 - 问题从这里开始:我是
我有一种方法可以将提供的 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;
}
在我看来 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
}
我正在尝试为我的任务编写自己的 Color 结构。 我的目标是我的缓冲区将始终包含一个 RGBA 值,即使它是用 ARGB 值初始化的。
我有 2 个构造函数:
- 单独获取 uint8_t 类型的 R、G、B、A 值 - 非常有效。
- 接受一个 uint32_t 并持有一个 ARGB 值 - 问题从这里开始:我是 我有一种方法可以将提供的 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;
}
在我看来 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
}