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

时间:2017-03-07 12:54:30

标签: c# video directshow directshow.net

我正在尝试使用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;
}

有没有办法避免轮换。<​​/ p>

1 个答案:

答案 0 :(得分:1)

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

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

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

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

最终,在大多数情况下,您必须按照现在的方式进行翻转,或者将图像数据加载到位图,如上所述。