从 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)
我无法让 vImage(加速框架)将 420Yp8_Cb8_Cr8(平面)转换为 ARGB8888