捕获前PictureBox中显示的图像不同,捕获的图像也不同

时间:2017-02-11 06:30:44

标签: c# .net winforms

我正在使用AForge.video.dllAForge.video.DirectShow.dll

我想保存拍摄时图片框中显示的确切图像(pbPhoto是我用来显示相机视频的图片框)

    void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        Bitmap bit = (Bitmap)eventArgs.Frame.Clone();
        pbPhoto.Image = bit;
    }

    private void btImage_Click(object sender, EventArgs e)
    {
        try
        {
            photo = true;

            if (!scanFlag)
            {
                btPrintPass.Enabled = false;
                scanFlag = true;                    

                cam = new VideoCaptureDevice(webcam[comboBox1.SelectedIndex].MonikerString);
                cam.NewFrame += new NewFrameEventHandler(cam_NewFrame);
                cam.Start();

                this.btImage.Text = "Stop Scan";
            }
            else
            {
                btPrintPass.Enabled = true;
                scanFlag = false;                    

                if (cam.IsRunning)
                {
                    cam.Stop();
                }               

                this.btImage.Text = "Scan Photo";
                string path = "temp.Jpeg";

                if (pbPhoto.Image != null)
                {
                    pbPhoto.Image.Save(path, ImageFormat.Jpeg);
                    //this.pictureBox1.Image.Save(path,ImageFormat.Bmp) ;
                    FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
                    //long Len = ss.Length ;
                    //this.pictureBox1.Image.Save(
                    m_barrImg = new byte[Convert.ToInt32(fs.Length)];
                    int iBytesRead = fs.Read(m_barrImg, 0, Convert.ToInt32(fs.Length));
                    fs.Close();
                }
            }
        }
        catch (Exception ex)
        {
            LogError(ex.ToString());
        }
        finally
        { }
    }      

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的,您面临的问题似乎来自pictuebox.SizeMode设置为Normal这一事实。 来自MSDN:

  

默认情况下,在普通模式下,图像位于PictureBox的左上角,图像的任何太大而不能用于PictureBox的部分都会被剪切。使用< strong> StretchImage 值会导致图像拉伸或缩小以适合PictureBox。使用缩放值会使图像拉伸或缩小以适合PictureBox;但是,保持原件的纵横比。

因此,如果您将SizeMode更改为StretchImageZoom,您会在picturebox中看到相同的确切图片。

也就是说,我还建议将以下检查添加到cam_NewFrame,因为可能直到相机实际停止流式传输,您将向前移动几帧。

void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
    if (!scanFlag) return;
    Bitmap bit = (Bitmap)eventArgs.Frame.Clone();
    pbPhoto.Image = bit;
}