2013-08-10 21 views
5

Kullanıcıya bir perfore düzenleme penceresi oluşturmaya çalışıyorum, bu pencerede bir Resim denetimi var
Bir görüntü dosyası seçtiğimde, bu Resim denetiminde gösterilir ve bunu kopyala görüntü klasöründeki dosya, ilk kez tamam, ama ikinci kez, bir hata gösteriyorResim dosyası, başka bir işlem tarafından kullanılıyor

"İşlem başka bir işlem tarafından kullanılmakta olduğundan 'C: \ 1.jpg' dosyasına erişemiyor."

Sana yüklemek ve bir görüntüyü, müsait dosya tutmak istiyorsanız ben

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

mesele burada dosyayı yükleyip bir görüntüye dönüştürerek nasıl yatıyor. Kullandığınız kurucu yöntemini kullanarak çalışmaz. 'Başka bir işlem tarafından kullanılan' istisnasından kaçınmak istiyorsanız alternatif yöntemler var. –

+0

Bu sorunu çözmek için ne yapabilirim? – Lai32290

cevap

5

neler yapabileceğini bilmiyorum benim Görüntü kontrolü bu dosyayı kullanıyor çünkü düşünüyorum, bu yüzden Dosya sistemindeki (yeniden yükleme veya başka bir dizine taşıma gibi) işlemlere Uri yapıcısı çalışmaz (çünkü işaret ettiğin gibi), BitmapImage sınıfı dosya tanıtıcısına kilitlenir.

Bunun yerine,

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

Bu yöntem FileInfo alır ve görüntülemek ve aynı anda başka bir dizine taşıyın veya yeniden görüntülemek bir BitmapImage döndürür ... Böyle bir yöntem kullanırlar.

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

Açık JPG dosyasını deniyorum, bu format için kod düzenledim; bitmap.Save (akış, ImageFormat.Jpeg); . Ancak FileFormatException'ı çalıştıracaktır. "Görüntü çözülemez. Resim başlığı bozuk olabilir." – Lai32290

+0

Ben herhangi bir jpeg veya jpg dosyası –

+0

Evet, bunu deneyin Bozuk değil. Tüm türler ekrana doğru şekilde işlenir. Ve merkezi konularda, artık istisna alamıyor musun? – Lai32290

2

aşağıda gösterilen yöntem dosyasından bir BitmapImage yükler ve yükleme hemen sonra dosyayı kapatır:

Daha basit bir yöntem, aşağıda başka bir yanıt kopyalanmış, bu. Kaynak akışı EndInit'dan hemen sonra kapatıldığında, BitmapCacheOption.OnLoad bayrağının ayarlanması gerektiğini unutmayın.

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

Bu kod, WPF tarafından desteklenen herhangi bir görüntü formatı için çalışacaktır. Görüntü dosyası içeriğini akış olarak StreamSource özelliğine geçirirken, WPF otomatik olarak uygun kod çözücüyü oluşturur.

1

Çok basit çözüm:

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

File.Copy(od.FileName, imageLocal, true); 
İlgili konular