サンプル画像:
DirectShow.net を使用して、Web カメラの映像をプログラムに取り込みます。これを達成するために、ソース カメラと VideoMixingRenderer9 をグラフに追加しています。
その部分はすべて問題なく動作していますが、GetCurrentImage(out lpDib) を使用してフレームを抽出する部分には、奇妙な問題としか言いようのないものがあります。
私がやっていることは、Marshal.PtrToSTructure を使用して lpDib から BitmapInfoHeader を作成し、幅/高さ/ストライド/& ピクセル形式を計算することです。
問題は、ビットマップに保存されている画像を見ると発生します-実際には右側から来た左側に幅10ピクセルの線があります!
GetCurrentImage 呼び出しから取得したデータが実際には上下逆になっていることに注意してください。Cap.RotateFlip の呼び出しに注意してください。
IntPtr lpDib;
windowlessCtrl.GetCurrentImage(out lpDib);
BitmapInfoHeader head;
head = (BitmapInfoHeader)Marshal.PtrToStructure(lpDib, typeof(BitmapInfoHeader));
int width = head.Width;
int height = head.Height;
int stride = width * (head.BitCount / 8);
PixelFormat pixelFormat = PixelFormat.Format24bppRgb;
switch (head.BitCount)
{
case 24: pixelFormat = PixelFormat.Format24bppRgb; break;
case 32: pixelFormat = PixelFormat.Format32bppRgb; break;
case 48: pixelFormat = PixelFormat.Format48bppRgb; break;
default: throw new Exception("Unknown BitCount");
}
Cap = new Bitmap(width, height, stride, pixelFormat, lpDib);
Cap.RotateFlip(RotateFlipType.RotateNoneFlipY);
//if we examine Cap here (Cap.Save, for example) I'm seeing the odd stripe.
私はここで完全に迷っています。ある種のオフセットの問題のように思えます。ストライドを少し調整してみましたが、役に立ちませんでした (奇妙な斜めの外観を作成するだけです)。