【玩转.Net MF – 04】远程屏幕截图2010-11-10 csdn 叶帆实现远程屏幕截图的思路很简单,就是直接获取设备的显存数据,由PC再现画 面。由于我们已经实现了Custom信道,所以我们在原有程序基础上,增添一个 Custom_Command_Screenshots命令,就可以完成数据的获取。但是比较麻烦的是 ,对不同的LCD设备,同样显示画面,显存数据有可能不同,对嵌入式设备,常见 的LCD显示是16位色(也有1位或8位色的,但比较少见),简便起见,我们仅考虑 16色显示画面的截图。16位色图根据RGB的分量数值,一般有如下几种模式:1555,565,555,第一 种最高位含有透明度,我们把它和555归为一类,第二种和第三种比较常见。对565和555来说,中间一定是G(绿色),其分量值或5位或6位,没有什么分 歧。麻烦的是,低5位(或高5位)有可能是红色,也可能是蓝色,如果混淆,则 显示的画面会出现偏色,所以必须要准确获取该配置信息。获取数据和配置后,我们完全可以把获取的数据一个点一个点地画出来,但是 这样做,不仅导致画面显示慢,还会使我们失去一次深入探究C#位图呈现技术的 机会。下面我们将深入研究.Net Framework的位图显示技术,首先声明一个和设备显 示尺寸一样大小的位图(new Bitmap)。幸运的是,我们发现可以设置 PixelFormat.Format16bppRgb565和PixelFormat.Format16bppRgb555参数。但究 竟是RGB还是BGR模式却无法设置,如果不管这个参数,我们最终的截图,你会发 现和显示设备上的画面偏色(很感谢显示设备的默认16色模式和windows不同,否 则这个问题也许被掩盖了)。解决方案有两种,一是修改设备的显示驱动(我在 开发Cortex-M3的开发板显示驱动时,发现其显示模式RGB/BGR是可以配置的), 二是由上位机解决这个问题。为了使程序的通用性更强,我选择了后者。查相关资料,我们发现在BITMAPINFOHEADER(位图信息头)中有一项 biCompression,其含义如下:BI_RGB:没有压缩BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计 数和颜色索引);BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成BI_BITFIELDS:每个象素的比特由指定的掩码决定。如果我们位图的参数设置为PixelFormat.Format16bppRgb555模式,则 biCompression的值为BI_RGB,则我们将无法去设置RGB/BGR了,因为该结构体之 后,就是位图数据了。如果我们设置的参数为PixelFormat.Format16bppRgb565,则biCompression值 为BITFIELDS,BITMAPINFOHEADER结构体之后,会增加12个字节的数据,分别为4 字节的R值掩码、4字节的G值掩码和4字节的B值掩码,默认数据是0xF800、0x07E0 、0x001F。好了,我们的问题解决了,通过配置以上数据,便可解决我们的问题。此外,该配置参数从何而来?设备的开发者一定比上层软件开发者更清楚,所 以这个参数配置,就由我们设备上的代码提供。程序实现后,工作画面如下:
