菜单

视频控件上叠加的控件一起截图

下载

单个视频控件的截图,只要调用其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);
}
最近修改: 2025-06-19Powered by