Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正交旋转设备无关位图(DIB)以在窗口中显示的最有效方法是什么?_C++_Winapi_Bitmap_Rotation_Dib - Fatal编程技术网

C++ 正交旋转设备无关位图(DIB)以在窗口中显示的最有效方法是什么?

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=

我正在写一些代码,它从连接的网络摄像头中获取位图,顺时针旋转90度、180度或270度,并在窗口中显示

位图最初作为独立于设备的位图提供。什么是最有效的一系列调用(就复制内存而言),可以让我从源(位图)转到目标(在屏幕上旋转)


我使用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显示。似乎工作直接有效-谢谢!