Средний цвет (цвета X11) - PullRequest
       23

Средний цвет (цвета X11)

0 голосов
/ 13 ноября 2010

Я хочу заполнить пересечение двух (или более заполненных) прямоугольников средним цветом. У меня цвета каждого прямоугольника хранятся в виде беззнаковых целых. Как я могу получить средний цвет?

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 14 ноября 2010

Технически, возможно, вы работаете на устройстве с цветовой картой, что означает, что вам нужно пройти через управление цветом 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);
}
0 голосов
/ 14 ноября 2010
Color color1 = Color.FromArgb(UInt1);
Color color2 = Color.FromArgb(UInt2);
Color averageColor = Color.FromArgb(255,(color1.R + color2.R)/2,(color1.G + color2.G)/2,(color1.B + color2.B)/2);

Предполагается, что вам нужен полностью непрозрачный средний цвет.

...