从 IntPtr 缓冲区创建图像后图像需要翻转

Image needs to flip after creating a image from IntPtr buffer

我正在尝试使用 DirectShow 过滤器从网络摄像头获取图像。
我想在 PictureBox 上显示该图像。
为此,我必须旋转该图像。

代码示例:

public int BufferCB(double sampleTime, IntPtr pbuffer, int bufferLen)
{
    if (pbuffer == IntPtr.Zero || bufferLen == 0) return 0;
    var timeStamp = TimeSpan.FromSeconds(sampleTime);
    var image = new Bitmap(_videoResolution.Width, _videoResolution.Height, _stride, PixelFormat.Format24bppRgb, pbuffer);
    image.RotateFlip(RotateFlipType.Rotate180FlipX);
    RaiseFrameGrabbedEvent(image, timeStamp, pbuffer);
    return 0;
}

有什么方法可以避免这种旋转。

您需要翻转图像,因为视频 RGB 格式中的正常行顺序是相反的,即图像从下到上。 Bitmap class 构造函数按从上到下的顺序获取图像行。

您可以加​​载翻转图像并通过 image.RotateFlip 调用进行更正。

或者,您可以逐行将图像加载到 Bitmap 实例,以相反的顺序提供它们。如果您为第一行提供负步幅和相应的偏移量,也许它也可以立即解决(一些 API 接受这个,其他的不接受)。

或者,您可以将 Sample Grabber 设置为使用带负步幅的 RGB 格式,在这种情况下,抓取器缓冲区将具有正确的行顺序,但这需要您的管道中对此类 RGB 格式有一定的支持,而这不是有可能。

最终,在大多数情况下,您将不得不按照现在的方式进行翻转,或者像我上面提到的那样将图像数据加载到位图。