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

extract and return in decimal the individual components of an RGBA color

本文关键字:颜色 组成部分 RGBA 返回 十进制 提取      更新时间:2023-10-16

char* printRGBA(unsigned int color)

提取并以十进制返回单个RGBA 颜色的分量。

RGBA 颜色(红色、绿色、蓝色、Alpha) 可以使用 32 位存储以下格式的无符号整数:RRRRRRRRGGGGGGGG BBBBBBBB

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

该函数将以以下格式的小数字符串形式返回无符号的 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];
 }

我不知道如何进一步进行

你在

原始帖子中所说的是关键:

您的号码存储为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该大小。这样,您的调用函数就更明显地知道它们负责释放内存。

对于选项 2,有多种与sprintf相关的功能,例如有助于检查大小的snprint

如果你实际上在c++工作,但无论如何你仍然需要打印成char *,上面的建议是正确的,但你可以使用ostringstream以这种方式创建你的字符串

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

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