关于窗口模式下的IDirectDrawSurface7.Blt()的讨厌问题,各位大哥谢谢了!

时间:2023-01-16 19:47:47
小弟的程序从一块图像采集卡中获取DIB图像,然后复制到离屏表面,经过一点小处理后Blt到主表面。由于是在窗口模式下,因此无法控制主表面的色深。更糟糕的问题在于,图像采集卡获取的总是24bit的DIB,用户大多数情况下用的是16bit或者32bit显示模式。如果把离屏表面定死为24bit,那就彻底没戏了——IDireciDrawSurface7.Blt()是不作颜色转换的。
所以,离屏表面只能和主表面采用相同的色深。但这样一来,24Bit DIB到离屏表面的复制就必须完成色深转换。我尝试自己写了带有色深转换的复制过程,但是自己做转换的效率实在太低,30 FPS时CPU占用率已经让人一头汗了,而我的程序必须还要做其他的事情。而且,必须考虑24->16, 24->24, 24->32等各种情况,如果哪天图像采集卡变成16bit或者32bit了,那就废了……
后来,想了一个比较无耻的方法:每次复制的时候,都获取离屏表面的DC,然后将DIB图像DrawDIBDraw()上去。这样色深转换是不成问题了,但是,DrawDIBDraw()同样也是完全软件完成的,一点硬件加速也没有,效率实在不敢恭维,和自己写的差不多,甚至更糟:每次表面GetDC()都费不少时间,而且无端多了一个HDRAWDIB设备,还需要Video For Windows的支持,真是OOXX……
现在只好求教于各位大哥,有没有什么方法可以尽量让硬件加速完成带有色深转换的复制工作?

8 个解决方案

#1


我建议你使用D3D8来完成2D图像的编程

#2


问题在于我不能要求客户的机器上必须有DirectX 8呀,而且如果这样做的话,整套代码就要全改了。:(

#3


这个我就不清楚了,对不起
做游戏一班不会去做窗口的(我是指正规)

#4


呵呵,我现在都不喜欢用DX了。我现在自己做一套基于DX基本功能的扩展程序库,用来做游戏。就像风魂一样:)DX有好多问题都实在是太讨厌了一点,页面丢失,操作烦锁……

#5


gddsky:
那你的意思是在DX8中把DIB当作纹理,然后贴到一个多边形上?这样能完成色深转换吗?

#6


读图像文件时可以直接指定使用哪种方式的颜色模式(如A4R4G4B4)
色深转换,我没有试过,不过,你可以把24BIT转成32BIT啊,只要将ALPHA值都设为完全不透明就行了

#7


老大,可能我没说清楚,我从图像采集卡捕捉来的DIB可是30 FPS啊,每一帧都不一样,绝对不是从文件中读取的,要不然哪有这么麻烦,我可是要每秒转换30次啊!

#8


ao,本人水平不够了,我没有试过你说的DIB,所以也不知道要怎么做了,不过,说实话,你为什么一定要窗口式的呢???
还有,如果真的要窗口式的,我想你应该去看一下D3D8里面的MFC例程(对不起,对于MFC,我不感兴趣,所以就没有看了)
对不起了!

#1


我建议你使用D3D8来完成2D图像的编程

#2


问题在于我不能要求客户的机器上必须有DirectX 8呀,而且如果这样做的话,整套代码就要全改了。:(

#3


这个我就不清楚了,对不起
做游戏一班不会去做窗口的(我是指正规)

#4


呵呵,我现在都不喜欢用DX了。我现在自己做一套基于DX基本功能的扩展程序库,用来做游戏。就像风魂一样:)DX有好多问题都实在是太讨厌了一点,页面丢失,操作烦锁……

#5


gddsky:
那你的意思是在DX8中把DIB当作纹理,然后贴到一个多边形上?这样能完成色深转换吗?

#6


读图像文件时可以直接指定使用哪种方式的颜色模式(如A4R4G4B4)
色深转换,我没有试过,不过,你可以把24BIT转成32BIT啊,只要将ALPHA值都设为完全不透明就行了

#7


老大,可能我没说清楚,我从图像采集卡捕捉来的DIB可是30 FPS啊,每一帧都不一样,绝对不是从文件中读取的,要不然哪有这么麻烦,我可是要每秒转换30次啊!

#8


ao,本人水平不够了,我没有试过你说的DIB,所以也不知道要怎么做了,不过,说实话,你为什么一定要窗口式的呢???
还有,如果真的要窗口式的,我想你应该去看一下D3D8里面的MFC例程(对不起,对于MFC,我不感兴趣,所以就没有看了)
对不起了!