提取并以十进制返回 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 &lt;&lt; ((n &gt;&gt; 8) &amp; 0xff) &lt;&lt; ' ' &lt;&lt; (n &amp; 0xff) &lt;&lt; endl; 你能再解释一下吗:/ 了解运营商 【参考方案1】:

你在原帖中说你知道的是关键:

您的号码存储为32bit unsigned integer

各个值是RRRRRRRR GGGGGGGG BBBBBBBB AAAAAAAA

在那里你可以看到,有 32 个单独的位,R、G、B 和 A 各 8 个。

然后,处理此类问题的一种常见方法是一次通过 32 位数字 8 位。

要获取 AAAAAAAA 值,例如: int a_values = num &amp; 0x000000FF;

&amp; 运算符是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 颜色的各个分量的主要内容,如果未能解决你的问题,请参考以下文章

关于前端CSS的总结

十六进制颜色到等效的 RGBa,允许透明度

将 RGBA 转换为 HEX

将 8 位十六进制颜色转换为 rgba 颜色?

ruby 将十六进制颜色转换为RGBA

将十六进制转换为 RGBA