单个视频控件的截图,只要调用其saveJpg方法即可。若视频上叠加了控件,要一起截图保存,思路如下
1.将要截图的控件全部放在一个父panel中,对panel调用snapToPng截图即可
2.由于视频只能由saveJpg方法截图:
2.1在视频上叠加一个临时的panel(tmp_panel)
2.2把视频的saveJpg得到的图片,设给tmp_panel的背景
2.3把其他控件设到顶层,要不然被tmp_panel给盖住了
2.4 父panel->snapToPng截图
2.5删掉tmp_panel
具体代码如下:
/*** @brief 视频截图,含其内部的控件* 注:这是对视频控件父控件进行截图,故要将视频控件放到panel中,否则将整个页面截图* @param path 截图保存路径* @param isBGR RGB还是BGR* @param v1 视频控件* @param vecWidget 视频控件内要包含在截图内的控件*/static void mysnapToPng(const string& path, bool isBGR, SttFFmpeg v1,vector<STTWidget*>* vecWidget) {//1.先清掉缓存STTImage::cacheInvalidateSrc(NULL);//2.视频上创建一个panelSttPanel p = new STTPanel(getRuntime(), v1->getParentWidget(), "ffpanel");p->setMainArg(v1->mSettedX, v1->mSettedY, v1->mSettedwidth,v1->mSettedheight, 0);p->setMainStyle(0, 0xffffff, 0xffffff, GradDir::NONE, 255, 1, 0xc0c0c0);//3.隐藏panelp->setHidden(true);//4.视频截图string tmpsnap = "./data/tmpsnap.jpg";v1->saveJpg(tmpsnap);//等待截图完成while(!FileUtil::fileExists(tmpsnap))Util::sleepfor(10);//5.设给panel背景p->setBgImg(tmpsnap);//6.显示出来p->setHidden(false);//7.视频中的控件置顶if(vecWidget) {for(STTWidget* wid: *vecWidget) {wid->moveToIndex(v1->getParentWidget()->getChildCnt() - 1);}}//8.刷新v1->getParentWidget()->invalidate();//9.最后截图v1->getParentWidget()->snapshotToPng(path, isBGR);//10.删除paneldelete p;//11.删除临时图片#if __arm__Util::exe("rm "+tmpsnap, "r");#endif}void Frm12::wMButton3_clk_cb(uint16_t code, LvEvent e) {//截图调用vector<STTWidget*> vecWidget;//放入视频内要一起截图的控件vecWidget.push_back(wMCanvas1);//本例是用画布写的文字。你也可以用标签,如果有多个控件,逐一加入mysnapToPng("./data/mysnap.png",true,wMVideo1,&vecWidget);}