作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我必须将 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/
我是一名优秀的程序员,十分优秀!