C:为什么我的程序中的输出数字不在标准RGB范围内:0-255?

时间:2019-01-11 18:28:42

标签: c linux colors

仅对C有所了解,我整理了以下代码,并在Linux Mint 19上使用以下代码进行了编译:

gcc-7 -o getPixelColor getPixelColor.c -L/usr/X11/lib -lX11

且不带参数执行:

./getPixelColor

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>

void get_pixel_color(Display *d, int x, int y, XColor *color)
{
    XImage *image;
    image = XGetImage(d, RootWindow(d, DefaultScreen(d)), x, y, 1, 1, AllPlanes, XYPixmap);
    color->pixel = XGetPixel(image, 0, 0);
    XFree(image);
    XQueryColor(d, DefaultColormap(d, DefaultScreen(d)), color);
}

int main(int argc, char const *argv[])
{
    Display *disp = XOpenDisplay(":0");
    XColor pixel_color;
    get_pixel_color(disp, 0, 0, &pixel_color);
    printf("%d %d %d\n", pixel_color.red, pixel_color.green, pixel_color.blue);
    return 0;
}

问题:

我不知道为什么输出数字不在标准 RGB范围内:0-255?

当前输出示例(取自桌面图片[0,0]):

7683 8484 4097

预期的输出(由Wine运行的Windows颜色选择器获取):

29 32 16

我知道我需要将这些值转换为标准范围,那么您可以在公式上提出建议吗?

2 个答案:

答案 0 :(得分:2)

来自XColor man page

  

红色,绿色和蓝色值始终在0到65535之间(包括0和65535),与显示硬件中实际使用的位数无关。服务器将这些值缩小到硬件使用的范围。黑色用(0,0,0)表示,白色用(65535,65535,65535)表示。

您应该能够通过除法将它们缩小。例如

printf("%d %d %d\n", pixel_color.red/256, pixel_color.green/256, pixel_color.blue/256);

答案 1 :(得分:0)

XColor结构将RGB值存储在0到65535的范围内。可能有现代显示器,其颜色比默认范围还多。对于显示,这会缩小到适当的范围,这也是您应该做的。

有关更多信息,请参见https://tronche.com/gui/x/xlib/color/structures.html