【如何正确解析通过 RFB 协议发送的鼠标形状】

简介:

远程帧缓冲协议,即RFB(Remote Frame Buffer)协议是 VNC(Virtual Network Computing)软件所使用的通讯协议,用于客户端向服务器传送控制命令以及服务器向客户端发送其操作画面,借此,远程桌面共享软件(不涉及Windows自带的桌面共享)得以实现。

   本文仅对bill在开发过程中遇到的鼠标形状解析问题作简要记录。

   RFB协议规定,鼠标形状在伪编码范畴,协议原文如下:


       A client which requests the Cursor pseudo-encoding is declaring that it is capable of

   drawing a mouse cursor locally. This can signicantly improve perceived performance

   over slow links. The server sets the cursor shape by sending a pseudo-rectangle with

   the Cursor pseudo-encoding as part of an update. The pseudo-rectangle’s x-position

   and y-position indicate the hotspot of the cursor, and width and height indicate the

   width and height of the cursor in pixels. The data consists of width × height pixel

   values followed by a bitmask. The bitmask consists of left-to-right, top-to-bottom

   scanlines, where each scanline is padded to a whole number of bytes floor((width +

   7)/8). Within each byte the most signicant bit represents the leftmost pixel, with a

   1-bit meaning the corresponding pixel in the cursor is valid.


wKioL1MqaPORcO4TAACzYNERVrQ350.jpg


   协议规定鼠标指针伪编码格式为两个连续的数组,第一个数组用来保存指针形状的像素点,第二个数组则保存了一个位掩码,用来反映上述像素点的有效性。

   刚开始看这段描述,实在是没理解这个位掩码的功能,便直接忽略位掩码,得到了下图所示的指针原始RGB数据:

wKiom1MqcafC3RxUAAA7y4m6v9o068.jpg  wKioL1MqcYCwhQEEAAAznu_AZB0052.jpg

   乍看上去好像已经达到目的了,直到在客户端进行绘制才发现问题 —— 我们肉眼能够分辨出图中的指针,可是如何利用程序得到一个干净(没有黑色背景)的指针呢?貌似我们可以将该数组中所有黑色像素设为透明值来得到指针,但另一个问题又来了 —— 所有黑色像素透明后,白色指针便没有了边框,一旦VNC客户端显示背景为白色,鼠标就“消失”了。

   因此忽略位掩码的尝试是失败的。不得不再次认真理解 bitmask 的意义,才发现位掩码的真正用途:

   bitmask中每一个 bit 对应指针像素数组中的一个像素点(通常为 4bytes),以从左到右、自上而下的顺序反映对应像素点的有效性,若某 bit 为 1,则表示它对应的是有效的鼠标指针像素点,应予以保留。否则便可以将该像素点设为透明值。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bitmask_len 位掩码数组长度
bitmask 位掩码数组
cursor 鼠标指针像素数组
bytes_per_pixel 每个像素点字节数,通常为4
int  cursor_pixel_idx = 0;
for  ( int  i = 0; i < bitmask_len; ++i) {
   uint8_t mask = bitmask[i];
   for  ( int  j = 0; j < 8; ++j) {
     bool  is_pixel_valid = mask & 128;
     mask <<= 1;
       
     if  (!is_pixel_valid) {
       for  ( int  k = 0; k != bytes_per_pixel; ++k) {
         cursor[cursor_pixel_idx + k] = 0xFF;
       }
     }
                    
     cursor_pixel_idx += bytes_per_pixel;
   }
// for



   这样一来,便可以使程序“分辨“出上述图像中哪些像素才是真正的指针,而哪些像素是可以设为透明值加以忽略的。根据位掩码最终得到了如下的鼠标指针:

wKioL1MqhpvQalW5AAA0K7BaHD4323.jpg  wKiom1MqhsOTrwfvAAAudA9DG3k524.jpg



   现在便可放心的将指针绘制到客户端任何区域,而不用担心指针在白色区域无法识别的问题了。








     本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/1380289,如需转载请自行联系原作者





相关文章
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
854 3
|
10月前
|
网络协议
为何UDP协议不可靠?DNS为何选择UDP?
总的来说,UDP和TCP各有优势,选择哪种协议取决于应用的具体需求。UDP可能不如TCP可靠,但其简单、快速的特性使其在某些场景下成为更好的选择。而DNS就是这样的一个例子,它利用了UDP的优势,以实现快速、高效的名字解析服务。
545 14
|
12月前
|
存储 缓存 网络协议
DNS协议详解
通过本文,您可以全面了解DNS协议的各个方面,从而更好地理解和应用这一重要的互联网基础服务。
1932 44
|
11月前
|
编解码 监控 网络协议
RTSP协议规范与SmartMediaKit播放器技术解析
RTSP协议是实时流媒体传输的重要规范,大牛直播SDK的rtsp播放器基于此构建,具备跨平台支持、超低延迟(100-300ms)、多实例播放、高效资源利用、音视频同步等优势。它广泛应用于安防监控、远程教学等领域,提供实时录像、快照等功能,优化网络传输与解码效率,并通过事件回调机制保障稳定性。作为高性能解决方案,它推动了实时流媒体技术的发展。
588 5
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
857 3
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
522 3
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
1283 3
|
传感器
Modbus协议深入解析
Modbus协议是由Modicon公司(现施耐德电气)于1979年发明的串行通信协议,主要用于工业自动化系统中的PLC通信。本文深入解析了Modbus协议的主从模式、数据类型(线圈、离散输入、保持寄存器、输入寄存器)、帧结构和通信过程,并介绍了其应用场景和重要性。
|
负载均衡 网络协议 算法
OSPF与其他IGP协议的比较:全面解析与应用场景
OSPF与其他IGP协议的比较:全面解析与应用场景
479 0
|
前端开发 JavaScript 安全
深入解析 http 协议
HTTP(超文本传输协议)不仅用于传输文本,还支持图片、音频和视频等多种类型的数据。当前广泛使用的版本为 HTTP/1.1。HTTPS 可视为 HTTP 的安全增强版,主要区别在于添加了加密层。HTTP 请求和响应均遵循固定格式,包括请求行/状态行、请求/响应头、空行及消息主体。URL(统一资源定位符)用于标识网络上的资源,其格式包含协议、域名、路径等信息。此外,HTTP 报头提供了附加信息,帮助客户端和服务端更好地处理请求与响应。状态码则用于指示请求结果,如 200 表示成功,404 表示未找到,500 表示服务器内部错误等。
569 0
深入解析 http 协议

推荐镜像

更多
  • DNS