【问题标题】:Average color (X11 colors)平均颜色(X11 色)
【发布时间】:2010-11-13 20:52:27
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

    标签: graphics x11 rgb xlib


    【解决方案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);
    }
    

    【讨论】:

      【解决方案2】:
      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);
      

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

      【讨论】:

      • -1。这不是 Xlib 代码,也不是任何 X11 窗口工具包的代码。
      • 您在问题的任何地方都没有提到 X11。
      • 这个问题被称为“平均颜色(X11 颜色)”并标记为“x11”和“xlib”——这非常明确。