保存图像时 GDI+ 中的一般错误

Generic Error in GDI+ when saving image

我正在尝试在单击按钮时保存 picEmployeeImage 的图像。 PicEmployeeImage 流式传输视频,因此当按下拍照时,它会将其保存到文件中。目前,当我尝试时,它显示 "a generic error occured in GDI+"

我该如何解决这个问题?

请帮忙。

代码如下:

public void TakePhoto()
        {
            Bitmap bm = new Bitmap(picEmployeeImage.Width, picEmployeeImage.Height);
            bm = (Bitmap) picEmployeeImage.Image;
            bm.Save(@"\Images\" + currentlySelectedId + ".bmp", ImageFormat.Bmp);

        }


private void btnCaptureNewImage_Click(object sender, EventArgs e)
        {
            if (btnCaptureNewImage.Text == "Capture New Image")
            {
                VideoShow();
                btnCaptureNewImage.Text = "Take Photo";
            } else
            {
                TakePhoto();
                btnCaptureNewImage.Text = "Capture New Image";
            }
        }

 void VideoShow()
        {
            VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            FinalVideoSource = new VideoCaptureDevice(VideoCaptureDevices[0].MonikerString);
            FinalVideoSource.NewFrame += new NewFrameEventHandler(FinalVideoSource_NewFrame);
            FinalVideoSource.Start();
        }

 void FinalVideoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
            {
                image = (Bitmap)eventArgs.Frame.Clone();
                image = CropBitmap(image, 150, 100, 300, 200);
                picEmployeeImage.Image = image;
            }

更新: 错误信息:

System.Runtime.InteropServices.ExternalException (0x80004005): A generic error occurred in GDI+.
   at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
   at System.Drawing.Image.Save(String filename, ImageFormat format)
   at BusinessSoftware.frmLoginPage.TakePhoto() in C:\Users\....cs:line 721
   at BusinessSoftware.frmLoginPage.btnCaptureNewImage_Click(Object sender, EventArgs e) in C:\Users\....cs:line 705
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

这是因为 GDI+ Image class 不是线程安全的。

创建一个新的位图图像并在这个新的位图对象上绘制您捕获的图像并保存这个新对象。代码如下:

public void TakePhoto()
{
    Bitmap bm = new Bitmap(picEmployeeImage.Width, picEmployeeImage.Height);
    bm = (Bitmap)picEmployeeImage.Image;

    Bitmap bmp = new Bitmap(bm.Width, bm.Height);
    Graphics g = Graphics.FromImage(bmp);
    g.DrawImage(bm, 0, 0, bmp.Width, bmp.Height);
    bmp.Save(@"\Images\" + currentlySelectedId + ".bmp", ImageFormat.Bmp);
}

此外,我建议您在单击 "Take Photo" 按钮时停止 FinalVideoSource

private void btnCaptureNewImage_Click(object sender, EventArgs e)
{
    if (btnCaptureNewImage.Text == "Capture New Image")
    {
        VideoShow();
        btnCaptureNewImage.Text = "Take Photo";
    }
    else
    {
        FinalVideoSource.Stop();
        TakePhoto();
        btnCaptureNewImage.Text = "Capture New Image";
    }
}

HTH.