C++ 正交旋转设备无关位图(DIB)以在窗口中显示的最有效方法是什么?
我正在写一些代码,它从连接的网络摄像头中获取位图,顺时针旋转90度、180度或270度,并在窗口中显示 位图最初作为独立于设备的位图提供。什么是最有效的一系列调用(就复制内存而言),可以让我从源(位图)转到目标(在屏幕上旋转)C++ 正交旋转设备无关位图(DIB)以在窗口中显示的最有效方法是什么?,c++,winapi,bitmap,rotation,dib,C++,Winapi,Bitmap,Rotation,Dib,我正在写一些代码,它从连接的网络摄像头中获取位图,顺时针旋转90度、180度或270度,并在窗口中显示 位图最初作为独立于设备的位图提供。什么是最有效的一系列调用(就复制内存而言),可以让我从源(位图)转到目标(在屏幕上旋转) 我使用C++和Win32 API。< p>你必须理解位图是如何在内存中表示的,它是行的。你可以选择是否倒置。例如,从左上角开始,然后得到第一行的所有像素(x=0..cx,y=0),直到达到位图的宽度(cx)。然后您可能会有一个跨步(一些填充字节),然后开始下一行像素(x=
我使用C++和Win32 API。
< p>你必须理解位图是如何在内存中表示的,它是行的。你可以选择是否倒置。例如,从左上角开始,然后得到第一行的所有像素(x=0..cx,y=0),直到达到位图的宽度(cx)。然后您可能会有一个跨步(一些填充字节),然后开始下一行像素(x=0..cx,y=1) 请记住,变换非常简单:对于90度和270度,您需要分别复制每个像素。对于180度,您可以使用memcpy
为每行“翻转”位图。您还可以使用高度为负值的BitBlt
通过使用通过
CreateDIBSection
或使用GetDIBits
接收到的指针,可以直接访问位。如果您已将这些位图绘制为内存DC,请记住在使用位之前调用GdiFlush
。感谢您的建议,我尝试过这样做,但它似乎需要的CPU几乎是下面所述方法的两倍。我猜这是因为位图数据首先通过位图构造函数进行复制,然后再通过RotateFlip进行复制。该程序运行在一个相当旧且速度较慢的嵌入式Windows XP系统上,因此我需要使其尽可能高效。我最终将通过capVideoStreamCallback提供的图像数据复制到一个缓冲区,然后在下一个绘制事件中由DrawDibDraw显示。似乎工作直接有效-谢谢!