ISampleGrabberCB ::示例不起作用

时间:2013-11-03 22:13:09

标签: c# image-processing bitmap directshow directshow.net

我正在尝试将从示例抓取器获取的每个帧转换为位图,但它似乎不起作用。

我正在使用SampleCB,如下所示:

int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample sample)
    {
        try
        {
            int lengthOfFrame = sample.GetActualDataLength();
            IntPtr buffer;
            if (sample.GetPointer(out buffer) == 0 && lengthOfFrame > 0)
            {
                Bitmap bitmapOfFrame = new Bitmap(width, height, capturePitch, PixelFormat.Format24bppRgb, buffer);
                Graphics g = Graphics.FromImage(bitmapOfFrame);
                Pen framePen = new Pen(Color.Black);
                g.DrawLine(framePen, 30, 30, 50, 50);
                g.Flush();
            }
        CopyMemory(imageBuffer, buffer, lengthOfFrame);           
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

        Marshal.ReleaseComObject(sample);


        return 0;
    }

我正在绘制一个小图形作为测试人员,它似乎不起作用。据我所知,这应该是为每个帧添加一个小行,因此用行更新我的预览。

如果需要,我可以提供额外的代码(例如我如何设置图表并连接我的ISampleGrabber)

编辑我认为Dee Mon的意思:

int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample sample)
{
    try
    {        

        int lengthOfFrame = sample.GetActualDataLength();
        IntPtr buffer;
        BitmapData bitmapData = new BitmapData();
        if (sample.GetPointer(out buffer) == 0 && lengthOfFrame > 0)
        {                    
            Bitmap bitmapOfFrame = new Bitmap(width, height, capturePitch, PixelFormat.Format24bppRgb, buffer);                    
            Graphics g = Graphics.FromImage(bitmapOfFrame);
            Pen framePen = new Pen(Color.Black);
            g.DrawLine(framePen, 30, 30, 50, 50);
            g.Flush();
            Rectangle rect = new Rectangle(0, 0, bitmapOfFrame.Width, bitmapOfFrame.Height);
            bitmapData = bitmapOfFrame.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            IntPtr bitmapPointer = bitmapData.Scan0;


            CopyMemory(bitmapPointer, buffer, lengthOfFrame); 
            BitmapOfFrame.UnlockData(bitmapData);
        }

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }

    Marshal.ReleaseComObject(sample);


    return 0;
}

1 个答案:

答案 0 :(得分:2)

创建位图时,它会将数据复制到自己的内部缓冲区,并且所有绘图都在该缓冲区中,而不是在您的缓冲区中。在位图中绘制东西后,使用Bitmap.LockBits和BitmapData类来获取其内容。