C:为什么在我的程序中输出的数字不在标准RGB范围:0-255?
我只掌握了C语言的基本知识,就编写了以下代码,并在Linux Mint 19上使用这些代码进行编译:C:为什么在我的程序中输出的数字不在标准RGB范围:0-255?,c,linux,colors,C,Linux,Colors,我只掌握了C语言的基本知识,就编写了以下代码,并在Linux Mint 19上使用这些代码进行编译: gcc-7 -o getPixelColor getPixelColor.c -L/usr/X11/lib -lX11 并无条件地执行: ./getPixelColor #包括 #包括 #包括 无效获取像素颜色(显示*d、int x、int y、XColor*颜色) { XImage*图像; image=XGetImage(d,根窗口(d,默认屏幕(d)),x,y,1,1,所有平面,XYP
gcc-7 -o getPixelColor getPixelColor.c -L/usr/X11/lib -lX11
并无条件地执行:
./getPixelColor
#包括
#包括
#包括
无效获取像素颜色(显示*d、int x、int y、XColor*颜色)
{
XImage*图像;
image=XGetImage(d,根窗口(d,默认屏幕(d)),x,y,1,1,所有平面,XYPixmap);
颜色->像素=XGetPixel(图像,0,0);
XFree(图像);
XQueryColor(d,DefaultColormap(d,DefaultScreen(d)),颜色);
}
int main(int argc,char const*argv[]
{
显示*disp=XOpenDisplay(“:0”);
XColor像素_颜色;
获取像素颜色(显示、0、0和像素颜色);
printf(“%d%d%d\n”,pixel\u color.red,pixel\u color.green,pixel\u color.blue);
返回0;
}
问题: 我不知道为什么输出数字不在标准RGB范围内:0-255 当前输出示例(取自桌面图片[0,0]):
7683844097
预期输出(使用Wine运行的Windows颜色选择器获取):
293226
我知道我需要将这些值转换为标准范围,你能建议公式吗?结构将RGB值存储在0到65535的范围内。可能有现代显示器,其颜色比默认范围更多。对于显示,这是缩小到适当的范围,这也是您应该做的 有关更多信息,请参阅。来自: 红色、绿色和蓝色值始终在0到65535的范围内,与显示硬件中实际使用的位数无关。服务器将这些值缩小到硬件使用的范围。黑色由(0,0,0)表示,白色由(655356553565535)表示 你应该能够通过除法将它们缩小。e、 g
printf("%d %d %d\n", pixel_color.red/256, pixel_color.green/256, pixel_color.blue/256);
XColor
的定义是无符号短红色、绿色、蓝色
。。尝试使用%hu
而不是%d
来帮助调试:确保获取像素颜色()
成功并初始化像素颜色
。十六进制输出往往比十进制更能提供信息。正确的除数是(唯一输入值的数量)/(唯一输出值的数量)
=(65535-0+1)/(255-0+1)
=65536/256
=256
,而不是257。@Vlastimil:我建议你接受这个答案;毕竟,越来越白痴的人提到除数257只是一个例子。我的评论是要指出,为了统一地缩放范围,你应该使用正确的除数;所以,实际上只是一个附加说明,关于如何选择一个除数来满足他们的特殊需要。