16 bpp到32 bpp的转换

时间:2010-12-08 13:14:58

标签: c++ winapi gdi

我们有一个编码器库,需要32 bpp的数据。我们有一个屏幕捕获库,它也需要支持16 bpp。每当我需要将新的屏幕捕获传递给编码器时,我想将16bpp原始数据转换为32bpp。如何有效地完成,还有其他选择吗?

我不想更改编码器库,因为这也需要在编码器上游进行更改。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以将源位图加载到HBITMAP中,使用所需的像素格式创建目标位图,然后将源绘制到目标上。这将是最简单的方法。

如果您想直接使用这些位,那么这是可能的,但让系统为您担心更容易。系统执行它可能会更快,因为它会得到很好的优化。

答案 1 :(得分:1)

使用BitBlt:

“如果源设备和目标设备上下文的颜色格式不匹配,则BitBlt函数会转换源颜色格式以匹配目标格式。”

http://msdn.microsoft.com/en-us/library/dd183370%28v=VS.85%29.aspx

答案 2 :(得分:1)

澄清其他答案:您需要使用CreateDIBSection以您感兴趣的格式创建位图:16bpp和32bpp。

这个函数的一个方便之处是它返回一个带有像素数据的内存缓冲区指针,允许您从一个源容易地初始化位图,并提取像素数据以提供给编码器库。

源位图不需要是DIBSection,它可以是任何类型的HBITMAP(只要它与您尝试选择它的HDC兼容 - 但屏幕捕获库将为您提供屏幕DC兼容HBITMAP,如果它给你一个HBITMAP

然后可以使用BitBlt让设备驱动程序执行格式转换。

相关问题