Технически, возможно, вы работаете на устройстве с цветовой картой, что означает, что вам нужно пройти через управление цветом X11 для всего этого.Вам нужно запросить у XColor
двух ваших входных цветов, вычислить среднее значение, а затем найти ближайший представимый цвет:
// Query XColor for both input colors
XColor xcol1, xcol2, outcol;
xcol1.pixel = color1;
xcol2.pixel = color2;
XQueryColor(display, colormap, &xcol1);
XQueryColor(display, colormap, &xcol2);
// Average red/green/blue and look up nearest representable color
outcol.red = (xcol1.red + xcol2.red) / 2;
outcol.green = (xcol1.green + xcol2.green) / 2;
outcol.blue = (xcol1.blue + xcol2.blue) / 2;
XAllocColor(display, colormap, &outcol);
// outcol.pixel is now the color to use
На устройстве с палитрой вам также необходимо после этого освободить цвет и т. Д.- это беспорядок, в основном.
Но, по всей вероятности, вы находитесь на 32-битном устройстве truecolor, что означает, что целое число - это просто битовое поле r, g, b и a (не обязательно в таком порядке).Вы можете рассчитать их среднее значение так:
UInt out_color = 0;
for (int i=0; i < 4; i++) {
// Extract channel i from both input colors
UInt in1 = (color1 >> (i*8)) & 0xff;
UInt in2 = (color2 >> (i*8)) & 0xff;
// Compute the average and or it into the output color
out_color |= ((in1 + in2) / 2) << (i*8);
}