gpt4 book ai didi

c++ - 如何将 DWORD RGBA 转换为整数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:52 35 4
gpt4 key购买 nike

我必须将 DWORD(unsigned long)RGBA 转换为四个 int 变量(R、G、B 和 A)到目前为止,我有将 4 个整数转换为 DWORD 的函数:

unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{
return ((iA << 24) | (iR << 16) | (iG << 8) | iB);
}

我怎样才能把它转换回来?

有点像

struct RGBA
{
int R, G, B, A;
};

RGBA DWORD2RGBA(unsigned long dwColor)
{
static RGBA tmp;
//.......conversion process
return tmp;
}

如有任何帮助,我们将不胜感激! :)

谢谢

最佳答案

如果我是你,我会坚持在打包/解包函数中使用乘法-加法运算。像这样

unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{
return ((iA * 256 + iR) * 256 + iG) * 256 + iB;
}

具有对称解包功能

RGBA DWORD2RGBA(unsigned long dwColor)
{
RGBA tmp; /* why did you declare it static??? */

tmp.B = dwColor % 256; dwColor /= 256;
tmp.G = dwColor % 256; dwColor /= 256;
tmp.R = dwColor % 256; dwColor /= 256;
tmp.A = dwColor % 256; /* dwColor /= 256; */

return tmp;
}

请注意,整个代码中只有一个“魔法常量”。

当然,如果您有一个根据打包数据中的位模式编写的外部规范,则基于位和移位操作的版本可能更可取。还是

unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{
return (((((iA << 8) + iR) << 8) + iG) << 8) + iB;
}

RGBA DWORD2RGBA(unsigned long dwColor)
{
RGBA tmp; /* why did you declare it static??? */

tmp.B = dwColor & 0xFF; dwColor >>= 8;
tmp.G = dwColor & 0xFF; dwColor >>= 8;
tmp.R = dwColor & 0xFF; dwColor >>= 8;
tmp.A = dwColor & 0xFF; /* dwColor >>= 8; */

return tmp;
}

“魔法常量”少得多。

现在您可以将重复的操作/子表达式包装在宏中,或者更好的是,内联函数,并获得非常紧凑和可读的打包器/解包器。

关于c++ - 如何将 DWORD RGBA 转换为整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1582372/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com