2010-11-13 230 views
0

我想用平均颜色填充两个(或更多填充)矩形的交点。我将每个矩形的颜色存储为无符号整数。我如何获得平均颜色?平均颜色(X11颜色)

谢谢你的帮助!

回答

-1
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); 

这是假设你需要一个完全不透明的平均颜色。

+0

-1。这不是Xlib代码,也不是针对任何X11窗口工具包的代码。 – 2010-11-14 00:35:19

+0

你的问题中没有提到X11。 – Flipster 2010-11-14 01:15:32

+0

这个问题被称为“平均颜色(X11颜色)”,并标记为“x11”和“xlib” - 这是非常明确的。 – 2010-11-14 03:35:47

1

从技术上讲,您可能在色彩映射设备上运行,这意味着您需要通过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); 
}