SOS 怎样用OVERLAY表面在视频画面上叠加半透明的背景效果.

PlayStation 2004-03-19 09:06:48
各位,有知道的吗?请指点一二吧.
视频那块我是通过主表面采用BLT的方式从OFFSCREEN表面获取视频数据的,现在是想在申请一个OVERLAY表面,用于叠加半透明的背景.叠加部分的主要执行API如下:
ret =m_lpDDSOverlay->UpdateOverlay(&m_rcSrc, m_lpddPrimary, &rcWindow, DDOVER_SHOW, &m_OverlayFormat);
我现在不明白的主要是对该函数的入口参数中的FLAG应该怎么设置,除了DDOVER_SHOW以为还应加入哪些FLAG标识.另外对于m_OverlayFormat结构里面的各项成员应该怎样赋值,才能实现半透明背景的效果.

望多多帮忙啊!!!!!!!!!!
...全文
328 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Magnus 2004-07-28
  • 打赏
  • 举报
回复
mark
JakeLian 2004-03-23
  • 打赏
  • 举报
回复
我从一些技术文章或书籍得知, DIRECTX7.0对Overlay的ALPHA透明通道都不能支持,不知道现在的9.0能是否支持! 看看MS的文章说明吧! 不要浪费时间了
show 2004-03-22
  • 打赏
  • 举报
回复
你的是什么显卡,可能是你的显卡不支持这种格式的overlay, 一般的显卡都不支持Rgb/Yuv
的overlay,只支持一些Fourcc的格式(我家的ati8500是可以的),DirectDraw例子程序中有一个Overlay的程序用的就是rgb的overlay如果你能运行成功就说明你的显卡支持。

按道理说即使用fourcc的overlay也应该可以透明的。不然vmr是怎么做的?

为何你为什么非要用overlay? 普通的dd表面不是很好吗!!
PlayStation 2004-03-22
  • 打赏
  • 举报
回复
在创建OVERLAY表面时,如果把PIXEL FORMAT 设置成RGB32的格式,老是创建不成功.代码如下
ddpfFormat.dwFlags=DDPF_RGB;
ddpfFormat.dwRGBBitCount=m_bmpInfoHeader.biBitCount;

如果把其设置以下格式则成功.
ddpfFormat.dwFlags=DDPF_FOURCC;
ddpfFormat.dwFourCC=MAKEFOURCC('Y','U','Y','2');
ddpfFormat.dwYUVBitCount=32;

另外我试了一下,对OVERLAY不进行PIXEL FORMAT设置,创建时也无法成功.看来我现在唯一的出路就是ALPHABLEND 了
PlayStation 2004-03-22
  • 打赏
  • 举报
回复
我看了一下好像DX9系列的示例程序中已经没有用OVERLAY表面的吧,用到的只是采用FLIP的方式.
至于使用fourcc的overlay也应该可以透明的,我不敢肯定,只是我实在不知道参数该怎么设置.能不能给出一个具体的API调用策略.
另外为什么非要用OVERLAY主要是因为我的主表面已经用于视频的显示了,所以要用一个OVERLAY的表面覆盖上一层半透明的位图.当然,老兄如果能有在不改边主表面性质的前提下的另外解决方法,望能相告啊.我被这个问题已经折磨了一个星期了.
show 2004-03-21
  • 打赏
  • 举报
回复
如果你的显卡支持rgb32的overlay按我的方法两个表面都用rgb32的pixel format相信应该很容易成功的。
JakeLian 2004-03-20
  • 打赏
  • 举报
回复
我也曾经想这么做,后来也参考了很多文档! 直接与Overlay叠加实现半透明的, 我估计在技术上很难实现或者是不可能, 最好做法是写一个Filter,然后再Filter里做半透明效果(这时是已经合成半透明效果的图像帧了,然后再输出显示
PlayStation 2004-03-19
  • 打赏
  • 举报
回复
差不多吧,由于OVERLAY是在最顶层的.所以确切地说应该是把OVERLAY的内容做成半透明的,把视频画面的内容给透出来.
show 2004-03-19
  • 打赏
  • 举报
回复
你的意思是你要把视频的东西透明的显示在己知窗口上吗?
PlayStation 2004-03-19
  • 打赏
  • 举报
回复
ret=m_lpddPrimary->Blt(&rcWindow,m_lpddExchange,&m_rcSrc, DDBLT_WAIT, NULL);
这个是我的主表面,它从m_lpddExchange表面上获取视频数据,其中m_lpddExchange表面类型为offScreen表面.
紧接着的代码为
ret =m_lpDDSOverlay->UpdateOverlay(&m_rcSrc, m_lpddPrimary, &rcWindow, DDOVER_SHOW, &m_OverlayFormat);
其中m_lpDDSOverlay表面上附有背景色的数据,表面类型为OVERLAY,它的左右就是把背景色刷到主表面上去.
现在我的问题是,当把背景色刷上去后,就把主表面上原来的视频画面给覆盖掉了.我现在想解决的问题是如何让这个OVERLAY表面上的背景数据半透明,从而即能够显示背景色,又能透出视频画面.
show 2004-03-19
  • 打赏
  • 举报
回复
没看懂。
只能有一个overlay表面。
通常我的做法是主表面是overlay叠加表面为blt方式。
show 2004-03-19
  • 打赏
  • 举报
回复
最小化是没有影响的。
根据我的经验,如果你要使GetDC()成功的话就不能设置pixel_format参数。
directdraw会取当前的像素值生成rgb的表面。
PlayStation 2004-03-19
  • 打赏
  • 举报
回复
VMR方式我以前实现过.现在主要是我的一整套解码器的构架采用的DSOUND和DDRAW模式的.所以必须采用DDRAW来做.我这边的视频表面和附加表面刚好跟你反了反.你用OVERLAY来处理视频,不知道最小化窗口以及窗口切换你是怎么处理的.感觉OVERLAY处在最顶层,很难控制.

另外请问一下:是不是只有主表面才能获取DC设备,无论我是用OVERLAY 还是用OFFSCREEN表面,都无法调用GetDC()函数获得成功.
show 2004-03-19
  • 打赏
  • 举报
回复
我的做法是除了,主表面外,另有两个表面,一个是视频的overlay表面a,另一个是普通的
表面b用来存储帖加的图片。显示的时候,把b表面blt到a表面上,再把a 表面帖到主表面上。透明的方式好搞点,半透明的方式可能麻烦点,因为有alpha通道,可能对你的视频格式有所要求。如果你用的是DirectShow的模式,建议用VMR,这样比较方便。
PlayStation 2004-03-19
  • 打赏
  • 举报
回复
当然.
我现在能够做到的是在2000下,利用某个解码器能够显示视频图像.
现在我想在此基础上在视频图像上贴上一幅静止的图片,要求该图片半透明,能够透射出当前正在解码的图像.而且该图片的颜色能够随入口参数的改变而改变.
show 2004-03-19
  • 打赏
  • 举报
回复
能否详细描述一下你想做什么?
如果你只想透明显示一幅位图,Windows2000下用AlphaBend即可。不需要用DirectDraw.

UpdateOverlay()的作用是更新overlay的参数。
PlayStation 2004-03-19
  • 打赏
  • 举报
回复
我是先把一幅背景位图的内容读入OVERLAY内,然后通过OVERLAY再送入主表面的.
UpdateOverlay()中不是有个入口参数是DDOVERLAYFX类型的地址吗?
我看到在这个结构里有很多ALPHA值和色彩键值的成员,这些变量难道没作用吗?

另外我在一篇相关资料里看到有这么一句话:

UpdateOverlay()函数用于更新大量的重叠设置,包括重叠是否可见,以及重叠是以色彩键码还是用ALPHA混合到背景表面上.

不知道你对这句话又是怎么理解的.
show 2004-03-19
  • 打赏
  • 举报
回复
overlay 的做成透明估计有些困难。overlay 是从内存直接到显卡的通道,估计中间不会做一些其它运算的。

况且你用overlay必须要在一定的底色上进行,底色已经固定,如何还能对己有的窗口透明。

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧