2017-02-11 83 views
0

我使用AForge.video.dllAForge.video.DirectShow.dll捕获前显示在PictureBox中的图像不同且捕获的图像不同

我想保存这是在拍摄时显示的图片框精确图像(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 
     { } 
    }  
+0

与您想要的图像有什么不同?只有几帧未来? –

+0

picturebox图像显示为像缩放图像,但在捕获图像后,它看起来像是从太远捕获图像 – shridhar

+0

然后我怀疑它是'picturebox'的'SizeMode'属性。它是什么? –

回答

0

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

默认情况下,在正常模式,图像定位在图片框的左上角,这是太大的图片框图像的任何部分clipped.Using StretchImage值会导致图像伸展​​或缩小以适应PictureBox。使用Zoom值会导致图像被拉伸或收缩以适应PictureBox;但是,原稿的高宽比保持不变。如果你改变

所以SizeModeStretchImageZoom您将在picturebox完全相同的图像看到。

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

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

谢谢Ofir Winegarten,它的工作.... – shridhar