2017-03-07 15 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ではこれを受け入れるか、それ以外の場合は受け付けない)、一度にうまくいくかもしれません。

または、ネガティブストライドのRGBフォーマットを使用するように設定することもできます。この場合、グラバーバッファの行順序は正しくなりますが、パイプラインにはこのようなRGBフォーマットがある程度サポートされている必要があります。

最終的には、ほとんどの場合、あなたが今やっているように反転するか、上記のように画像データをビットマップに読み込む必要があります。

+0

反転するとCPU使用量が増加します。それを減らす方法はありますか? – iamyz

関連する問題