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

Posted

技术标签:

【中文标题】将 X11 显示转发到 Windows 时出现颜色问题【英文标题】:Color issues when forwarding X11 display to Windows 【发布时间】:2011-03-23 19:51:11 【问题描述】:

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

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

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

有什么想法吗?

编辑

如果我不使用XCreateImageXPutImage 并使用我想要的前景色创建GC,并使用XDrawPoint,它就可以正常工作。似乎是XImage 的问题,或者使用GC 时问题会自动解决。

【问题讨论】:

您会说您的图像看起来像Wikipedia 中的“不正确的调色板”示例吗? 不,据我所知不是索引问题。颜色图是完整的 32 位。此外,就混乱而言,仅显示绿色,蓝色和黑色,但没有红色,根本没有,甚至没有混合(例如也没有紫色) 不要放弃 Windows X 服务器中存在错误的可能性。不妨试试不同的 X 服务器软件进行比较。 很好地找到它 :) 我建议将解决方案写成答案并选择它,这样将来它会在其他人眼中脱颖而出。 我可以按照我在编辑中提到的方式进行操作,但是,这会对性能造成很大影响,所以我尽量避免这样做。 【参考方案1】:

我找到了一个解决方案。问题似乎源于 Windows 如何处理颜色与 Linux。 Windows 存储颜色 BGR 和 BGRA,而 Linux 存储颜色 RGB 和 ARGB。因此,每当显示器进入 Windows 时,我需要在调用 XAllocColor 之前交换 Red 和 Blue 值,之后,我需要将 XColorpixel 元素乘以 256 以将颜色移过 alpha组件。

有一些与此相关的问题:

    应用程序无法判断显示是在 Linux 还是 Windows 上呈现,所以我使用环境变量进行测试 这仅适用于 Windows 上的 32 位屏幕深度,如果深度仅为 24 位,则忽略乘以 256,小于我不知道的值

因此,我实际上正在执行我在 Edit 中建议的方法,并进行了一些修改。主要是,我为我计划在初始化期间使用的每种颜色创建一个GC,因此我可以根据需要查找它们,而不是每次都创建它们。与使用XImage 相比,这使性能保持在合理水平。

【讨论】:

以上是关于将 X11 显示转发到 Windows 时出现颜色问题的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.7.12 Matplotlib x11 转发不显示或抛出多个错误

Cygwin/X x11 从 Raspberry Pi 转发到 Windows

Ubuntu 上的 X11 转发错误,尽管它适用于 Windows

linux下如何将GNOME Desktop桌面的信号通过x11转发到当前设备的桌面上?

将 POST 从 api 转发到另一个时出现错误代码 415

CentOS x11 转发问题