S
Scarlette
Unregistered / Unconfirmed
GUEST, unregistred user!
??小弟的程序从一块图像采集卡中获取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……
??现在只好求教于各位大哥,有没有什么方法可以尽量让硬件加速完成带有色深转换的复
制工作?
后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……
??现在只好求教于各位大哥,有没有什么方法可以尽量让硬件加速完成带有色深转换的复
制工作?