2017-03-07 131 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