2017-03-07 132 views
1

我试图使用DirectShow过滤器从网络摄像头获取图像。
我想在PictureBox上显示该图像。
为此,我必须旋转该图像。从IntPtr缓冲区创建图像后,图像需要翻转

代码示例:

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; 
} 

有什么办法避免旋转。

回答

1

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

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

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

或者,您可以设置Sample Grabber以负向跨步使用RGB格式,在这种情况下,grabber缓冲区将具有正确的行顺序,但这需要您的管道中支持此类RGB格式,这不太可能。

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

+0

翻转增加CPU使用率。有什么办法可以减少这种情况。 – iamyz