2 つ (またはそれ以上の塗りつぶし) の長方形の交点を平均色で塗りつぶしたいと考えています。各四角形の色を unsigned int として保存しています。平均色を取得するにはどうすればよいですか?
助けてくれてありがとう!
技術的には、カラーマップ デバイスで実行している可能性があります。つまり、これらすべてについて X11 カラー管理を行う必要があります。XColor
2 つの入力色を照会し、平均を計算してから、最も近い表現可能な色を検索する必要があります。
// 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);
これは、完全に不透明な平均色が必要であることを前提としています。