2016-04-25 7 views
-1
int countimages = 0; 
     private void timer1_Tick(object sender, EventArgs e) 
     {   
      Image img = sc.CaptureWindowToMemory(windowHandle); 
      Bitmap bmp = new Bitmap(img,img.Width,img.Height); 
      bmp.Save(@"e:\screenshotsofpicturebox1\screenshot" + countimages + ".bmp"); 
      bmp.Dispose(); 

      string[] images = Directory.GetFiles(@"e:\screenshotsofpicturebox1\", "*.bmp"); 
      if (images.Length > 0) 
      { 
       if (pictureBox1.Image != null) 
       { 
        File.Delete(images[0]); 
        countimages = 0; 
        pictureBox1.Image.Dispose(); 
       } 
       pictureBox1.Image = Image.FromFile(images[countimages]); 
      } 
      countimages += 1; 
      label1.Text = countimages.ToString(); 
     } 
  1. Ich möchte Bild auf der Festplatte auf die PictureBox1 das Bild
  2. Last speichern
  3. nach dem Bild zu PictureBox1 geladen löschen Sie die Datei von der Festplatte
  4. ein neues Bild pariert Festplatte und laden Sie es in das BildBox1
  5. löschen Sie die Datei und so weiter jedes Mal mit einem neuen Bild.

Das Problem jetzt ist i Ausnahme auf der Linie bin immer:Wie kann ich das Bildformularverzeichnis zu pictureBox laden, die Bilddatei nach dem Laden in die Picturebox und wieder zu den nächsten Bildern löschen?

File.Delete(images[0]); 

Der Prozess kann nicht die Datei e:\screenshotsofpicturebox1\screenshot0.bmp zugreifen, da sie von einem anderen Prozess verwendet wird.

Ein weiteres Problem, das ich jetzt sah es jedes Mal eine neue Datei auf die Festplatte rettende

screenshot0.bmp 
screenshot1.bmp 

Aber ich wan nur eine Datei jedes Mal screenshot0.bmp und einfach ersetzen sie jedes Mal mit einem neuen Bild zu sein.

+1

gut ist das Bild offen im Bildfeld, so dass es sinnvoll ist, man es richtig nicht löschen ..? Aus demselben Grund, wenn Sie ein Bild in einem Foto-Viewer öffnen und dann versuchen, es zu löschen, erhalten Sie eine Fehlermeldung darüber, wie es nicht gelöscht werden kann, da es in einem anderen Prozess geöffnet ist. – Jacobr365

+0

Warum sollten Sie es sogar speichern und löschen Sie es von der Festplatte, wenn Sie einfach alles zusammen vermeiden und es nur in der Bildbox anzeigen können? –

Antwort

0

Ihren Code lesen Ich nehme an, dass Sie versuchen, den Bildschirm in der Bildbox bei jedem Tick-Ereignis anzuzeigen. Also, wenn das Ihr Ziel ist es, die Sie benötigen, um das Image-Objekt auf die PictureBox Image-Eigenschaft wie diese nicht zu speichern/löschen, nur zuweisen:

private void timer1_Tick(object sender, EventArgs e) { 
    Image refToDispose = pictureBox1.Image; 
    pictureBox1.Image = sc.CaptureWindowToMemory(windowHandle); 
    refToDispose.Dispose(); 
} 

Wenn Sie speichern möchten/löschen Sie es trotzdem, Sie können eine direkt geladene Bitmap nicht aus der Datei an die PictureBox übergeben, da sie die Datei während der Verwendung sperren wird.

Stattdessen können Sie ein Grafikobjekt aus einer anderen Bitmap-Instanz mit der Größe des Bildes erstellen und es zeichnen, sodass die neue Bitmap eine Kopie ohne die Dateisperre ist, die Sie der PictureBox zuweisen können. dieses

In Ihrem Code ändern:

pictureBox1.Image = Image.FromFile(images[countimages]); 

Um dies:

using (Image imgFromFile = Image.FromFile(images[countimages])) { 
    Bitmap bmp = new Bitmap(imgFromFile.Width, imgFromFile.Height); 
    using (Graphics g = Graphics.FromImage(bmp)) { 
     g.DrawImage(imgFromFile, new Point(0, 0)); 
    } 
    pictureBox1.Image = bmp; 
} 
Verwandte Themen