C: Почему выходные номера не в стандартном диапазоне RGB: 0-255 в моей программе? - PullRequest
0 голосов
/ 11 января 2019

Имея только минимальные знания 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

Ожидаемый результат (взят с помощью средства выбора цвета Windows, запущенного Wine):

29 32 16

Я понял, что мне нужно преобразовать значения в стандартный диапазон. Не могли бы вы посоветовать тогда формулу?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Со страницы руководства XColor :

Значения красного, зеленого и синего имеют значение всегда в диапазоне от 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);
0 голосов
/ 11 января 2019

Структура XColor хранит значения RGB в диапазоне от 0 до 65535. Вероятно, существуют современные мониторы, которые имеют больше цветов, чем диапазон по умолчанию. Для отображения это уменьшено до соответствующего диапазона, что вы тоже должны делать.

См. https://tronche.com/gui/x/xlib/color/structures.html для получения дополнительной информации.

...