提取并以十进制返回 RGBA 颜色的各个分量
Posted
技术标签:
【中文标题】提取并以十进制返回 RGBA 颜色的各个分量【英文标题】:extract and return in decimal the individual components of an RGBA color 【发布时间】:2016-02-24 01:15:16 【问题描述】:char* printRGBA(unsigned int color)
提取并以十进制返回个人 RGBA 颜色的组成部分。
一种 RGBA 颜色(红、绿、蓝、 Alpha) 可以使用 32 位存储 以下格式的无符号整数:RRRRRRRR GGGGGGGG BBBBBBBB AAAAAAA,其中每个分量为 8 位,范围为 (0255)。
该函数将返回 unsigned int 颜色作为小数字符串,格式如下:“(R, G, B, A)”。
例如,亮黄色的颜色是整数值
4291559679,二进制表示为:11111111 11001100 00000000 11111111,printRGBA
将返回字符串:“(255, 204, 0, 255)”。
我的尝试:
char* printrgba(long long int num)
int arr[64];
cin>>num;
int i=0,r;
while(num!=0)
r = num%2;
arr[i++] = r;
num /= 2;
for(int j=i-1;j>=0;j--)
cout<<arr[j];
我不知道该怎么做
【问题讨论】:
提示:cout << ((n >> 8) & 0xff) << ' ' << (n & 0xff) << endl;
你能再解释一下吗:/
了解运营商
【参考方案1】:
你在原帖中说你知道的是关键:
您的号码存储为32bit unsigned integer
。
各个值是RRRRRRRR GGGGGGGG BBBBBBBB AAAAAAAA
在那里你可以看到,有 32 个单独的位,R、G、B 和 A 各 8 个。
然后,处理此类问题的一种常见方法是一次通过 32 位数字 8 位。
要获取 AAAAAAAA
值,例如:
int a_values = num & 0x000000FF;
&
运算符是bitwise and
。该运算符将提取您号码的某些部分。
上面的十六进制字符串表示的位掩码是00000000000000000000000011111111
,它可以让你得到最右边的8位;
您可以通过这种方式获得所需的每组 8 位。
一旦你得到你的价值观,把它传达给你的来电者,你有两个选择:
-
使用
malloc
保留足够的空间,然后使用sprintf
进入。请记住,如果您这样做,您的调用者将不得不释放内存。
确保有足够的空间后,让调用者传递char *
和数据的大小,然后将sprintf
传递到其中。这样一来,您的调用函数就更清楚它们负责释放内存。
对于选项 2,有多种 sprintf
相关函数,如 snprint
,将有助于检查大小。
如果您实际上是在c++
工作,但无论如何您仍然需要打印到char *
,上述建议是正确的,但您可以使用ostringstream
以这种方式创建您的字符串
ostringstream stream;
stream << val1 << val2 << val3 << etc;
然后您可以根据需要将字符串流中的数据复制到char *
。
【讨论】:
我们不能使用 sprintf :/以上是关于提取并以十进制返回 RGBA 颜色的各个分量的主要内容,如果未能解决你的问题,请参考以下文章