2011-03-23 66 views
2

我有一个应用程序将数据逐行地绘制到X11显示屏上,其中每行实际上由不同颜色的像素组成。将X11显示转发到Windows时出现颜色问题

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

在Linux上运行显示器时,一切看起来都很棒,与预期完全一样。但是,当我通过ssh将X11显示转发到Windows时,颜色全部混乱。

任何想法?

编辑

如果我不使用XCreateImageXPutImage并与于地面的颜色我想创建一个GC,并使用XDrawPoint,它工作得很好。似乎是​​的问题,或者在使用GC时会自动克服该问题。

+0

你会说你的图像看起来像[维基百科](http://en.wikipedia.org/wiki/Indexed_color#Disadvantages)中的'不正确的颜色调色板'示例吗? – sarnold 2011-03-23 19:59:49

+0

不,不是一个索引问题,据我所知。色彩映射表是完整的32位。另外,尽管搞砸了,但只显示绿色,蓝色和黑色,但没有红色,根本没有,甚至没有混合(例如,没有紫色) – steveo225 2011-03-23 20:07:02

+1

不要放弃Windows X服务器中的错误可能性。也许尝试一个不同的X服务器软件进行比较。 – 2011-03-23 20:39:09

回答

0

我发现a解决方案。这个问题似乎源于Windows对颜色和Linux的区别。 Windows存储颜色BGR和BGRA,Linux存储颜色RGB和ARGB。所以,无论何时显示器进入Windows,我需要在调用XAllocColor和之后交换红色和蓝色值,我需要将XColorpixel元素乘以256,以将颜色移过alpha组件。

没有与此相关的一些问题:

  1. 如果显示屏在Linux或Windows渲染应用程序无法知道,所以我使用的环境变量,用于测试
  2. 这只适用于32位在Windows位屏深处,忽略256乘法如果深度仅为24位,低于我不知道

正因为如此,我其实做我在编辑建议的方法进行了一些修改。主要是,我为每个计划在初始化过程中使用的颜色创建GC,因此我可以根据需要查看它们,而不是每次都创建它们。这相对于使用​​可以合理地保持性能。