【发布时间】: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)。正如约翰所说,你是对的,这确实是问题所在。谢谢!
标签: c++ colors bit-shift rgba argb