基于WindML的屏幕任意矩形区域截图技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第43卷第3期应㊀㊀㊀用㊀㊀㊀科㊀㊀㊀技Vol.43ɴ.32016年6月
AppliedScienceandTechnology
Jun.2016
DOI:10.11991/yykj.201507022
网络出版地址:http://www.cnki.net/kcms/detail/23.1191.U.20160509.1433.002.html
基于WindML的屏幕任意矩形区域截图技术
张国超,吴限,熊芯,黄清清
中国船舶重工集团公司第七二六研究所,上海201100
摘㊀要:VxWorks嵌入式操作系统对于多媒体技术的支持不够便捷,并且没有提供类似Windows操作系统下的一键截图功能㊂针对这一问题,给出了基于WindML3.0进行图形界面开发的基本流程,实现了VxWorks操作系统框架下的JPEG图片显示功能以及基础绘图功能㊂此外还提出了一种基于位图数据块拷贝(BitBlt)技术的截图方法,并将位图数据块内容分别储为BMP和JPEG两种通用图片格式㊂实验结果表明,该方法实现了VxWorks下的截图功能,能够成功截取屏幕任意矩形区域的画面㊂
关键词:VxWorks;WindML;图形开发;截图技术;BMP;JPEG
中图分类号:TP317.4㊀㊀㊀㊀㊀㊀文献标志码:A㊀㊀㊀㊀㊀㊀文章编号:1009⁃671X(2016)03⁃066⁃04
ScreenshotskillsatanarbitraryrectangularareabasedonWindML
ZHANGGuochao,WUXian,XIONGXin,HUANGQingqing
ChinaShipbuildingIndustryCorporationNo.726Institute,Shanghai201100,China
Abstract:VxWorksembeddedoperatingsystemisnotconvenientforthemultimediatechnology,anddoesnotpro⁃videdirectscreenshotfunctionsimilartoMicrosoftWindows.Aimingatthisphenomenon,thispaperpresentsabas⁃icprocessfordemonstrationusingWindML3.0graphics,whichisabletodisplayJPEGimagesanddobasicdraw⁃ingsunderVxWorksoperationsystem.Inaddition,thispaperproposesascreenshotapproachbasedonbitblocktransfer(BitBlt),andthecontentofthebitmapdatablockcanbestoredasBMPandJPEGformats,respectively.TheexperimentalresultsshowthattheproposedmethodcancapturethescreenofanyVxWorksrectangulararea.Keywords:VxWorks;WindML;Graphicsdevelopment;screenshot;BMP;JPEG收稿日期:2015-07-22.㊀㊀网络出版日期:2016-05-09.作者简介:张国超(1987-),男,助理工程师;
吴限(1982-),女,高级工程师.
通信作者:张国超,E⁃mail:zhangathit@163.com.
㊀㊀VxWorks操作系统是风河(WindRiver)公司于
1983年设计开发的一种嵌入式实时操作系统㊂它以其卓越的实时性及可靠性被广泛地应用于通信㊁军事㊁航空㊁航天等实时性和可靠性要求较高的领域中[1-2]㊂为了提供系统对多媒体技术的支持,Vx⁃Works提供了WindML多媒体开发组件,利用该组件用户可以方便㊁高效地开发出基于VxWorks的图形界面㊂本文主要介绍WindML配置方法,基于WindML的图形开发及图片显示的关键技术,提出了一种屏幕任意矩形区域图像截取方法,利用VxSim工具进行仿真,给出了仿真后的结果和关键代码㊂
1㊀WindML概述
Windmedialibrary(WindML)提供了对Vx⁃
Works嵌入式操作系统应用多媒体技术的支持[3],
它提供了丰富的图形㊁视频和音频操作接口,用来开
发多媒体应用程序及驱动程序㊂WindML包括:软件开发组件(SDK)和驱动开发组件(DDK)㊂
SDK组件用于多媒体应用程序的开发,该组件
提供了一个全面的图形开发函数集,用于处理图形㊁视频㊁音频㊁字体等多媒体操作,允许开发者开发独立于各种硬件平台的可移植代码[3-4]㊂在首次进行WindML图形开发前,需要对WindML进行配置㊂
2㊀WindML配置
WindML的配置工作可以使用Tornado的工具
菜单项tools下面的WindML配置对话框(如图1),可视化地完成配置[5-7]㊂本文实验用到的重要配置
参数如下:处理器类型为SIMNT,颜色表类型为16RGB565;分辨率是800ˑ600;勾选Jpeg和双缓冲支持选项㊂点击Build,编译WindML库,在对应(本文的位置为Ɣ(WIND_BASE)\target\lib\simpc\SIMNT\gnu)目录下生成一个名为libwndml.a的静态库㊂将该库文件链接到应用程序中,即可利用WindML提供的API进行图形界面开发㊂
图1㊀WindML配置界面
3㊀WindML图形界面开发及图片显示技术
㊀㊀使用WindML进行图形程序的开发一般有3个步骤:首先设置调色板,然后定义图形上下文,最后调用WindML相关API完成图形的绘制与显示㊂下面给出一个WindML图形开发简单例子的关键部分代码[8-10]:
uglInitialize();//UGL环境初始化
devId=(UGL_DEVICE_ID)uglRegistryFind(UGL_DISPLAY_TYPE,0,0,0)->id;//获取图形显示设备
gc=uglGcCreate(devId);//创建图形显示上下文
下面一段代码负责申请调色板所需要的内存㊂uglColorAlloc(devId,&colorTable[BLACK].rgb⁃Color,UGL_NULL,&colorTable[BLACK].uglColor,1);uglColorAlloc(devId,&colorTable[BLUE].rgbCol⁃or,UGL_NULL,&colorTable[BLUE].uglColor,1);
至此就完成了WindML图形开发所需要的准备工作,其中调色板部分根据需要进行增减申请内存代码行㊂
下面介绍WindML中图片显示的基本方法㊂假定需要显示一幅名字为show.jpg的JPEG图片到屏幕作为背景图片,下面给出图片显示的关键代码://只读方式打开需要显示的图片文件
fp_jpg=fopen("host:D:\\show.jpg","rb");//设置Jpeg参数
jpegMode.quality=75;
jpegMode.smooth=0;
jpegMode.scale=1;
//初始化,并获取jpeg控制句柄
jpegId=uglJpegInit(devId,&jpegVersion);//设置jpeg解压缩参数
uglJpegModeSet(jpegId,&jpegMode);
//利用WindML提供的API读取jpeg图片数据到jpegId
uglJpegToDDBFromFile(jpegId,fp_jpg,&jpegDdbId,UGL_NULL,0,0);
uglBitmapSizeGet(jpegDdbId,&jpegWidth,&jpegHeight);//获取图片的高度和宽度
//将jpeg图片显示在屏幕上
uglBitmapBlt(gc,jpegDdbId,0,0,jpegWidth-1,pegHeight-1,UGL_DEFAULT_ID,0,0);
同时可以利用WindML提供的API进行基础绘图工作,例如uglLine用于画线操作,uglEllipse用于绘制椭圆,uglRectangle用于绘制矩形等㊂本文以椭圆为例,其他复杂的图形设计,可以同理实现㊂具体代码如下:
uglForegroundColorSet(gc,colorTable[BLUE].uglColor);//设置前景色,蓝色
uglBackgroundColorSet(gc,colorTable[BLACK].uglColor);//设置背景色,黑色
uglLineWidthSet(gc,5);//设置线条宽度uglEllipse(gc,100,100,300,300,0,0,0,0);//在坐标(100,100)处绘制半径为200的圆
uglGcDestroy(gc);//释放资源
至此,完成图形显示功能,即背景图片的显示和绘制了一个蓝色外边框,背景色为黑色的圆形图案,使用Tornado2.2进行编译,利用Tornado自带模拟测试工具VxSim进行模拟测试,这里需要注意,适当增加默认的MemorySize值,例如本次使用的MemorySize为200000000,否则在图片显示阶段,会因为内存不足而报错㊂实验结果如图2所示

图2㊀图形显示结果
4㊀局部截图技术实现
在应用中,可能需要将当前感兴趣的内容截图,在Windows环境下,可以按下键盘PrtSc完成屏幕的全屏截图,网上也有很多优秀的局部截图工具可用,然而在Vxworks操作系统环境里,却没有这样方便的系统接口可以使用,而在实际应用中同样面临着截图的需要,鉴于此提出了一种基于Vxworks操
㊃76㊃
第3期㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀张国超,等:基于WindML的屏幕任意矩形区域截图技术
作系统的屏幕任意矩形区域的截图方法,并且能够将截图内容以jpg和bmp两种常用的图片存储格式进行存储,便于后续的使用㊂4.1㊀流程图
本文提出的截图方法具体流程如图3所示

图3 截图程序流程
4.2㊀关键代码
首先给出BMP格式的定义如下:
typedefstructtagBIAMAPFILEHEADER{//14字节BMP文件头定义㊀㊀WORDbfType;//0x4D42㊀㊀DWORDbfSize;㊀㊀WORDbfReserved1;㊀㊀WORDbfReserved2;㊀㊀DWORDbfOffBits;}BITMAPFILEHEADER;
typedefstructtagBITMAPINFOHEADER{//40字节BMP信息头定义㊀㊀DWORDbiSize;㊀㊀LONGbiWidth;㊀㊀LONGbiHeight;㊀㊀WORDbiPlanes;
㊀㊀WORDbiBitCount;
㊀㊀DWORDbiCompression;㊀㊀DWORDbiSizeImage;㊀㊀LONG㊀biXPelsPerMeter;㊀㊀LONG㊀biYPelsPerMeter;㊀㊀DWORDbiClrUsed;㊀㊀DWORDbiClrImportant;}BITMAPINFOHEADER;
lineBytes=(capWidth∗3+3)/4∗4;//bmp图片每行所需要字节数目,需要4bytes对齐㊂
为了读取显存数据,调用uglBitmapRead方法;将整个屏幕图形缓存读取到pDib数据结构中㊂将pDib对应的数据区内容按照矩形区域进行截取,并且将RGB565颜色模式转换为BMP存储需要的RGB888颜色模式,具体的代码如下所示:
for(i=left;i<right;++i)for(j=top;j<bottom;++j){
pSaveBuf[((j-top)∗capWidth+i-left)∗4]=((unsignedchar∗)(pDib->pImage))[(j∗screen⁃Width+i)∗4]pSaveBuf[((j-top)∗capWidth+i-left)∗4+1]=((unsignedchar∗)(pDib->pIm⁃age))[(j∗screenWidth+i)∗4+1];
pSaveBuf[((j-top)∗capWidth+i-left)∗4+2]=((unsignedchar∗)(pDib->pImage))[(j∗screenWidth+i)∗4+2];
pSaveBuf[((j-top)∗capWidth+i-left)∗4+3]=((unsignedchar∗)(pDib->pImage))[(j∗screenWidth+i)∗4+3];
//将读取的RGB565彩色模式转换为bmp彩色模式
Blue=(pSaveBuf[((j-top)∗capWidth+i-left)∗4]&0x1f)<<3;
Green=(pSaveBuf[((j-top)∗capWidth+i-left)∗4]>>5|((pSaveBuf[((j-top)∗capWidth+i-left)∗4+1]&0x07)<<3))<<2;
Red=pSaveBuf[((j-top)∗capWidth+i-left)∗4+1]&0xf8;
pBmpBuf[(bottom-j)∗lineBytes+(i-left)∗3]=Blue;
pBmpBuf[(bottom-j)∗lineBytes+(i-left)∗3+1]=Green;
pBmpBuf[(bottom-j)∗lineBytes+(j-left)∗3+2]=Red;

利用uglJpegFromDDB(jpegId,capDdbId,0,0,capWidth-1,capHeight-1,fp),来实现JPEG文件
㊃86㊃应㊀㊀㊀用㊀㊀㊀科㊀㊀㊀技㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀第43卷
类型的存储㊂4.3㊀注意事项
这里需要注意的要点有:WindML中每个像素用4个字节表示,本次WindML使用的颜色类型是RGB565格式,颜色排布如图4所示㊂BMP24色模式中,每个像素使用3个字节来表示,按照G(绿色)㊁B(蓝色)和R(红色)顺序排列㊂因此需要将RGB565颜色类型转换到BMP所需要的格式,具体转换过程参见上述代码

图4㊀RGB565颜色模式
4.4㊀实验结果
将上述代码编译并使用VxSim进行测试,给出
1次截图的结果,如图5所示㊂
图5㊀矩形区域截屏结果示意图
5㊀结束语
为了解决VxWorks操作系统下屏幕截图问
题,提出了一种基于WindML的截图方法㊂实验结果表明,本文给出的方法能够灵活的㊁高效的完成VxWorks操作系统下的屏幕任意矩形区域图像截图任务,填补了VxWorks操作系统下没有自带截图工具的空白㊂实际应用中,可以利用本文提出的截图方法对VxWorks下图形界面中感兴趣的画面进行截图,记录当前画面的瞬态效果,以便后续的对比研究㊂
本文的研究内容可进一步深入:利用截取屏幕的方法进行屏幕录制㊂首先按照一定频率截取屏幕内容,然后利用视频压缩算法(如H.264)转换为视频数据并保存为视频格式文件,即完成了屏幕录制功能,本文作者正在进行相关的研究㊂
参考文献:
[1]胥小武,余立建,刘洪雨.在WindML下汉字㊁图形界面
及图片显示的开发研究[J].铁路计算机应用,2014,
23(8):49-52.
[2]蔡华,卞新高,史中权,等.基于VxWorks的WindML图
形界面开发方法[J].工业控制计算机,2005,18(8):
28-30.
[3]郑元珠.基于VxWorks操作系统的雷达显示软件屏幕截图技术研究[J].舰船电子对抗,2010,33(2):116-120.
[4]陈恩庆,宋豫冀,王忠勇.VxWorks下图形用户界面的开发[J].微计算机信息,2003,19(3):48-49.[5]WindRiver.VxWorksProgrammer sguide5.4[M].Ala⁃meda,USA:WindRiverSystemsInc.,1999.[6]WindRiver.Tornadouser sguide[M].Alameda,USA:WindRiverSystemsInc.,1999.
[7]孔样营,柏桂枝.嵌入式实时操作系统VxWorks及其开发环境Tornado[M].北京:中国电力出版社,2002:89-92.[8]邝坚.Tornado/VxWorks入门与提高[M].北京:科学出版社,2004:11-35.
[9]王国夫,孙尧,苏柏泉.WindML事件驱动机制分析[J].计算机工程,2003,29(10):193-195.[10]练学辉,朱佳丽,乔大雷.基于WindML的图形开发与
应用[J].雷达与对抗,2015,35(1):65-68.本文引用格式:
张国超,吴限,熊芯,等.基于WindML的屏幕任意矩形区域截图技术[J].应用科技,2016,43(3):66-69.ZHANGGuochao,WUXian,XIONGXin,etal.ScreenshotskillsatanarbitraryrectangularareabasedonWindML[J].AppliedSci⁃
enceandTechnology,2016,43(3):66-69.

96㊃第3期㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀张国超,等:基于WindML的屏幕任意矩形区域截图技术。

相关文档
最新文档