我们有一个编码器库需要32 bpp数据。我们有一个屏幕捕获库,它也需要支持16 bpp。无论何时我需要将新的屏幕截图传递给编码器,我都想将16bpp原始数据转换为32bpp。它如何有效地完成,还有其他的选择吗?16 bpp到32 bpp转换
我不想更改编码器库,因为这需要编码器上游的更改。
谢谢!
我们有一个编码器库需要32 bpp数据。我们有一个屏幕捕获库,它也需要支持16 bpp。无论何时我需要将新的屏幕截图传递给编码器,我都想将16bpp原始数据转换为32bpp。它如何有效地完成,还有其他的选择吗?16 bpp到32 bpp转换
我不想更改编码器库,因为这需要编码器上游的更改。
谢谢!
为了澄清其他答案:你需要使用CreateDIBSection建立在你感兴趣的格式位图:16bpp的和32bpp的。
这个方便的东西是使用这个函数返回一个指向内存缓冲区和像素数据的指针,允许您轻松地从一个源初始化位图,并提取像素数据以提供给编码器库。
源位图不需要是DIBSection,它可以是任何类型的HBITMAP(只要它与HDC兼容,您尝试选择它) - 但屏幕捕获库将给您一个屏幕DC兼容HBITMAP,如果它给你一个HBITMAP)
BitBlt然后可以用于获取设备驱动程序执行格式转换。
您可以将源位图加载到HBITMAP中,使用所需的像素格式创建目标位图,然后将源绘制到目标上。这将是最简单的方法。
如果您想直接使用这些位,那么这将是可能的,但更容易让系统为您担心。系统执行时可能会更快,因为它会进行优化。
正如@jonaskje所说,你使用BitBlt来完成从源代码到目标的绘图 – 2010-12-08 13:44:10
使用的BitBlt:
“如果源和目标设备上下文的颜色格式不匹配,BitBlt函数转换源颜色格式以匹配目标格式。”
http://msdn.microsoft.com/en-us/library/dd183370%28v=VS.85%29.aspx
不是那么简单。虽然该语句在技术上是正确的,但问题是:“CreateBitmap”文档中引用了这句话:“但是,如果位图和DC具有相同的格式,则只能将位图选入设备上下文中。 – 2010-12-08 14:18:05
感谢您的详细解释。会试试看。 – RMR 2010-12-20 05:25:36