示例图片:
我正在使用 DirectShow.net 将网络摄像头素材放入我的程序中。为此,我将源相机添加到图表中,并添加了一个 VideoMixingRenderer9。
这部分工作正常,但我使用 GetCurrentImage(out lpDib) 提取帧的部分遇到了我只能描述为一个奇怪的问题。
我正在做的是使用 Marshal.PtrToSTructure 从 lpDib 创建一个 BitmapInfoHeader,然后计算宽度/高度/步幅/和像素格式。
当我查看存储在位图中的图像时,问题就出现了 - 它的左侧有一条 10 px 宽的线,实际上是右侧的!
值得注意的是,我从 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.
我完全迷失在这里。似乎是某种偏移问题,我尝试过一些调整,但无济于事(只会产生奇怪的对角线外观)。