提取并以十进制形式返回RGBA颜色的各个组件

时间:2016-02-24 01:15:17

标签: c++ string

char* printRGBA(unsigned int color)

提取并以十进制形式返回个人 RGBA颜色的组件。

RGBA颜色(红色,绿色,蓝色, Alpha)可以使用32位存储 无符号整数,格式如下:RRRRRRRR GGGGGGGG BBBBBBBB AAAAAAAA,其中每个分量为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];

 }

我不知道如何进一步继续

1 个答案:

答案 0 :(得分:2)

您在原帖中所说的内容是关键:

您的号码存储为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位。

获得价值后,要将其传达给来电者,您有两种选择:

  1. 使用malloc保留足够的空间,并sprintf进入其中。请记住,如果你这样做,你的来电者必须释放记忆。
  2. 在确保有足够的空间后,让调用者传递char *和数据的大小,然后sprintf。这样,你的调用函数就更明显了它们负责释放内存。
  3. 对于选项2,有sprintf个相关函数,如snprint,可帮助检查大小。

    如果您实际在c++工作,但仍然需要打印到char *,上述建议仍然适用,但您可以使用ostringstream创建字符串以这种方式

    ostringstream stream;
    
    stream << val1 << val2 << val3 << etc;
    

    然后,您可以根据需要将字符串流中的数据复制到char *