我想用平均颜色填充两个(或更多填充)矩形的交集。我将每个矩形的颜色存储为无符号整数。如何获得平均颜色?
谢谢你的帮助!
从技术上讲,您可能在色彩映射设备上运行,这意味着您需要通过 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 位真彩色设备,这意味着整数只是 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);
}
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);
这是假设您需要完全不透明的平均颜色。