远程帧缓冲服务器中的颜色编码不正确

时间:2016-03-07 13:57:51

标签: c encoding bitmap rfb-protocol

我正在使用" RAW"进行RFB服务器的简单实现。像素编码。我使用TightVNC作为我的桌面客户端。我让代码工作到客户端能够请求整个"桌面"这是640x480像素。我的测试图案在形状方面正确绘制,但颜色错误。

我尝试每像素使用8位:每个字节中有三个红色,三个绿色和两个蓝色编码为RRRGGGBB

我的ServerInit数据包包含此像素编码规范...

//all of these 13 fields are unsigned chars...

si.pf.bits_per_pixel = 8;
si.pf.depth = 8;
si.pf.big_endian_flag = 0;
si.pf.true_colour_flag = 1;

si.pf.red_max_hi = 0;
si.pf.red_max_lo = 7;    // 3 bits
si.pf.green_max_hi = 0;
si.pf.green_max_lo = 7;  // 3 bits
si.pf.blue_max_hi = 0;
si.pf.blue_max_lo = 3;   // 2 bits

si.pf.red_shift = 5;     // >>>>>RRR
si.pf.green_shift = 2;   // >>RRRGGG
si.pf.blue_shift = 0;    // RRRGGGBB

//remaining fields are omitted

因此定义了整个结构:

typedef struct
{
  uchar bits_per_pixel;
  uchar depth;
  uchar big_endian_flag;
  uchar true_colour_flag;

  uchar red_max_hi;
  uchar red_max_lo;
  uchar green_max_hi;
  uchar green_max_lo;
  uchar blue_max_hi;
  uchar blue_max_lo;

  uchar red_shift;
  uchar green_shift;
  uchar blue_shift;

  uchar padding0;
  uchar padding1;
  uchar padding2;
}tPixelFormat;

现在,如果我用0xe0(二进制111 000 00)填充我的桌面图像,那么我希望将其解释为纯红色。但它看起来像浅蓝色(好像8个单独的位被向后解释!)。我的测试图案的形状是正确的,因为我在顶角绘制了一些白色像素(白色显然是二进制111 111 11)。

我不明白这一点。我相信我已遵循RFB规范中描述的算法和编码... http://vncdotool.readthedocs.org/en/latest/rfbproto.html#serverinit

我做错了什么?

1 个答案:

答案 0 :(得分:1)

Wireshark救援!解决了它。

事实证明,客户端发送了一个我没有看到的SetPixelFormat请求,代码忽略了它,显然服务器被要求通过更改输出格式来满足请求。

修复方法是通过硬编码客户端要求的值,简单地向客户端提供它想要的内容。此时客户端再也不会再发送该请求,因为它对服务器从一开始就放弃的内容感到满意。