单个视频控件的截图,只要调用其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.视频上创建一个panel SttPanel 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.隐藏panel p->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.删除panel delete 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); }
需要确认型号或具体项目?联系技术支持 ↗