我正在使用AForge.video.dll
和AForge.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
{ }
}
正如我在评论中提到的,您面临的问题似乎来自pictuebox.SizeMode
设置为Normal
的事实。从 MSDN:
默认情况下,在"正常"模式下,图像位于图片框的左上角,并且图像中对于图片框来说太大的任何部分都将被剪裁。使用拉伸图像值会导致图像拉伸或收缩以适合图片框。使用缩放值会导致图像被拉伸或缩小以适合图片框;但是,保留了原件中的纵横比。
因此,如果您将SizeMode
更改为StretchImage
或Zoom
您将在picturebox
中看到完全相同的图像。
也就是说,我还建议您添加以下检查 到您的cam_NewFrame
,因为在相机实际停止流式传输之前,您可能会向前移动几帧。
void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (!scanFlag) return;
Bitmap bit = (Bitmap)eventArgs.Frame.Clone();
pbPhoto.Image = bit;
}