2010-11-13 298 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); 
}