2016-08-28 1 views
0

Ich versuche das Bild von picEmployeeImage zu speichern, wenn auf eine Schaltfläche geklickt wird. PicEmployeeImage streamt ein Video. Wenn Sie also ein Foto aufnehmen, wird es in einer Datei gespeichert. Derzeit, wenn ich es versuche, sagt es "ein allgemeiner Fehler aufgetreten in GDI +"Generischer Fehler in GDI + beim Speichern des Bildes

Wie behebe ich das?

Bitte Hilfe. Hier

ist der Code:

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; 
      } 

Update: Fehlerinformationen:

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) 
+0

Genaue Ausnahme? Anrufliste? –

Antwort

0

Dies liegt daran, GDI + Image-Klasse ist nicht Thread-sicher.

Erstellen Sie ein neues Bitmap-Bild und zeichnen Sie das Bild, das Sie für dieses neue Bitmap-Objekt aufgenommen haben, und speichern Sie dieses neue Objekt. unten Code:

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); 
} 

Auch ich würde Ihnen vorschlagen, die FinalVideoSource zu stoppen, wenn "Take Photo" -Taste

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 geklickt wird.

Verwandte Themen