提取并以十进制形式返回 RGBA 颜色的各个组成部分
extract and return in decimal the individual components of an RGBA color
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 位集合中的每一组。
获得值后,要将其传达给调用方,您有两种选择:
- 使用
malloc
保留足够的空间,并sprintf
其中。 请记住,如果这样做,您的呼叫者将不得不释放内存。 - 让调用方传递
char *
和数据大小,然后在确保有足够的空间后sprintf
该大小。这样,您的调用函数就更明显地知道它们负责释放内存。
对于选项 2,有多种与sprintf
相关的功能,例如有助于检查大小的snprint
。
如果你实际上在c++
工作,但无论如何你仍然需要打印成char *
,上面的建议是正确的,但你可以使用ostringstream
以这种方式创建你的字符串
ostringstream stream;
stream << val1 << val2 << val3 << etc;
然后,您可以根据需要将数据从字符串流复制到char *
中。
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 列表视图更改选择颜色
- GtkTreeView 交替行颜色
- dx11 渲染到纹理仅显示透明颜色
- 使用 OpenGL 4.5 更改所选顶点的颜色
- 为什么我的 LEGACY OPENGL 颜色反转了?
- 双击更改 mfc 中列表控件中的行的颜色
- 更改 QT 中按钮的颜色
- 当我使用CHAR_INFO结构时,控制台会无缘无故地改变颜色
- 列表视图项的替代颜色
- GLSL 将 uint 转换为浮点颜色
- std::带有颜色和标题的 clog 包装器无法正确打印整数
- Vec3b:r/g/b 颜色的最大值为 254,而不是 255
- 如何将矢量对象更改为不同的颜色?
- PPM 颜色显示错误
- 如何更改 QGraphicsItem 对象的颜色?
- 提取并以十进制形式返回 RGBA 颜色的各个组成部分