2013-08-10 20 views
5

Ich versuche, ein Benutzer perfil Bearbeitungsfenster zu erstellen, in diesem Fenster hat ein Bild Steuerelement
Wenn ich eine Bilddatei ausgewählt, wird es in diesem Bild anzeigen und kopieren Sie dies Datei in meinem Bildordner, das erste Mal ist in Ordnung, aber zum zweiten Mal zeigt es einen FehlerImage-Datei kopieren, wird von einem anderen Prozess verwendet

"Der Prozess kann nicht auf die Datei 'C: \ 1.jpg' zugreifen, weil es von einem anderen Prozess verwendet wird."

Ich denke, es liegt daran, dass meine Image-Steuerelement diese Datei verwendet, so, ich weiß nicht, was kann ich

private void Select_Click(object sender, RoutedEventArgs e) 
{ 
    OpenFileDialog od = new OpenFileDialog(); 
    if (od.ShowDialog() == true) 
    { 
     string imageLocal = @"C:/1.jpg"; 
     File.Copy(od.FileName, imageLocal, true); 
     image1.Source = new BitmapImage(new Uri(imageLocal)); 
    } 
} 
+0

Das Problem hierbei liegt darin, wie Sie die Datei laden und es in ein Bild umgewandelt wird. Es funktioniert nicht mit der von Ihnen verwendeten Konstruktormethode. Es gibt alternative Methoden, wenn Sie die Ausnahme "Von einem anderen Prozess verwendet" vermeiden möchten. –

+0

Was kann ich für Resolver dieses Problem tun? – Lai32290

Antwort

5

tun Wenn Sie ein Bild laden und anzeigen möchten, und halten Sie die Datei zugänglich Für Operationen im Dateisystem (wie das erneute Laden oder Verschieben in ein anderes Verzeichnis) funktioniert der Uri-Konstruktor nicht, weil (wie Sie darauf hinweisen) die BitmapImage-Klasse am Dateihandle hängt.

Verwenden Sie stattdessen eine Methode wie folgt ...

private static BitmapImage ByStream(FileInfo info) 
    { //http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/dee7cb68-aca3-402b-b159-2de933f933f1 
     try 
     { 
      if (info.Exists) 
      { 
       // do this so that the image file can be moved in the file system 
       BitmapImage result = new BitmapImage(); 
       // Create new BitmapImage 
       Stream stream = new MemoryStream(); // Create new MemoryStream 
       Bitmap bitmap = new Bitmap(info.FullName); 
       // Create new Bitmap (System.Drawing.Bitmap) from the existing image file 
              (albumArtSource set to its path name) 
       bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
       // Save the loaded Bitmap into the MemoryStream - Png format was the only one I 
           tried that didn't cause an error (tried Jpg, Bmp, MemoryBmp) 
       bitmap.Dispose(); // Dispose bitmap so it releases the source image file 
       result.BeginInit(); // Begin the BitmapImage's initialisation 
       result.StreamSource = stream; 
       // Set the BitmapImage's StreamSource to the MemoryStream containing the image 
       result.EndInit(); // End the BitmapImage's initialisation 
       return result; // Finally, set the WPF Image component's source to the 
           BitmapImage 
      } 
      return null; 
     } 
     catch 
     { 
      return null; 
     } 
    } 

Diese Methode ein Fileinfo nimmt und gibt ein Bitmap, die Sie anzeigen können und es gleichzeitig in ein anderes Verzeichnis verschieben oder es wieder anzuzeigen.

Eine viel einfachere Methode, aus einer anderen Antwort unten kopiert, ist dies:

public static BitmapImage LoadBitmapImage(string fileName) 
{ 
    using (var stream = new FileStream(fileName, FileMode.Open)) 
    { 
     var bitmapImage = new BitmapImage(); 
     bitmapImage.BeginInit(); 
     bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
     bitmapImage.StreamSource = stream; 
     bitmapImage.EndInit(); 
     bitmapImage.Freeze(); 
     return bitmapImage; 
    } 
} 
+0

Ich versuche JPG-Datei zu öffnen, ich hatte Code für dieses Format bearbeitet; bitmap.Save (Strom, ImageFormat.Jpeg); . Aber es wird FileFormatException ausführen. "Das Bild kann nicht decodiert werden. Der Bildkopf ist möglicherweise beschädigt." – Lai32290

+0

Versuchen Sie es mit einer unverfälschten Datei –

+0

Ja, als ich versuchte ImageFormat.PNG und PNG-Datei, hatte kein Problem, hat nur Probleme, wenn ich JPEG, für alle JPEG-oder JPG-Datei verwenden – Lai32290

2

Das Verfahren unten lädt eine Bitmap aus der Datei und sofort schließt die Datei nach dem Laden. Beachten Sie, dass das Flag BitmapCacheOption.OnLoad gesetzt werden muss, wenn der Quelldatenstrom direkt nach EndInit geschlossen wird.

public static BitmapImage LoadBitmapImage(string fileName) 
{ 
    using (var stream = new FileStream(fileName, FileMode.Open)) 
    { 
     var bitmapImage = new BitmapImage(); 
     bitmapImage.BeginInit(); 
     bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
     bitmapImage.StreamSource = stream; 
     bitmapImage.EndInit(); 
     bitmapImage.Freeze(); // just in case you want to load the image in another thread 
     return bitmapImage; 
    } 
} 

Dieser Code funktioniert für jedes Bildformat, das von WPF unterstützt wird. Wenn WPF den Bilddateiinhalt als Stream an die Eigenschaft StreamSource übergibt, erstellt WPF automatisch den entsprechenden Decoder.

1

Sehr einfache Lösung:

System.GC.Collect(); 
System.GC.WaitForPendingFinalizers(); 

File.Copy(od.FileName, imageLocal, true); 
Verwandte Themen