将X11显示转发到Windows时出现颜色问题

时间:2011-03-23 19:51:12

标签: windows linux x11 x11-forwarding

我有一个应用程序可以逐行绘制数据到X11显示器,其中每一行真的由不同颜色的像素组成。

我是通过使用XImage*将数据数组映射到XCreateImage来实现的。然后,在处理数据时,我使用红色,绿色和蓝色值填充XColor变量,并调用XAllocColor来分配颜色。然后我将像素值分配给数据数组中的相应元素。设置完所有数据后,我使用XPutImage绘制线条。

在Linux上运行显示器时,一切看起来都很棒,完全符合预期。但是,当我通过ssh将X11显示器转发到Windows时,颜色都搞砸了。

有什么想法吗?

修改

如果我不使用XCreateImageXPutImage并使用我想要的forground颜色创建GC,并使用XDrawPoint,则效果很好。似乎是XImage的问题,或者在使用GC时会自动解决问题。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案。问题似乎源于Windows如何处理颜色与Linux。 Windows存储颜色BGR和BGRA,其中Linux存储颜色RGB和ARGB。因此,每当显示器进入Windows时,我需要在调用XAllocColor之前交换红色和蓝色值,之后,我需要将pixel的{​​{1}}元素乘以256将颜色移过alpha分量。

有一些与此相关的问题:

  1. 应用程序无法判断显示是在Linux或Windows上呈现,因此我使用环境变量进行测试
  2. 这仅适用于Windows上的32位屏幕深度,如果深度仅为24位,则忽略乘以256,小于我不知道的
  3. 因此,我实际上是在我的编辑中建议的方法,只做了一些修改。主要是,我为初始化时计划使用的每种颜色创建XColor,因此我可以根据需要查找它们,而不是每次都创建它们。与使用GC相比,这可以使性能保持合理。