2009-11-06 3 views
9

Buona giornata tutto,Problemi di sovrascrittura (ri-salvataggio) dell'immagine quando era impostata come sorgente immagine

Ho problemi con i permessi delle immagini.

Sto caricando un'immagine da file, ridimensionandola e salvandola in un'altra cartella. sto quindi la visualizzazione di questo modo:

uriSource = new Uri(Combine(imagesDirectoryTemp, generatedFileName), UriKind.Absolute); 

    imgAsset.Source = new BitmapImage(uriSource); 

Questo sta lavorando bene, il problema arriva se l'utente seleziona poi un'altra immagine subito dopo e cerca di salvare il file originale.

Un'eccezione viene generata al momento di salvare la mia immagine "ExternalException: A generic error occurred in GDI+."

Dopo un po 'di gioco in giro ho ridotto l'errore fino a imgAsset.Source = new BitmapImage(uriSource); come la rimozione di questa linea e non l'impostazione del Imagesource mi permette di sovrascrivere il file più volte.

Ho anche provato a impostare la sorgente su qualcos'altro, prima di ri-risparmiare nella speranza che il vecchio riferimento sarebbe stato smaltito, questo non era il caso.

Come posso superare questo errore?

Grazie, Kohan

Modifica

Ora utilizzando questo codice non ricevo l'eccezione ma la fonte immagine non sta aggiornando. Inoltre dal momento che non sto usando un SourceStream, non sono sicuro di cosa ho bisogno di smaltire per farlo funzionare.

 uriSource = new Uri(Combine(imagesDirectoryTemp, generatedFileName), UriKind.Absolute); 

     imgTemp = new BitmapImage(); 
     imgTemp.BeginInit(); 
     imgTemp.CacheOption = BitmapCacheOption.OnLoad; 
     imgTemp.UriSource = uriSource; 
     imgTemp.EndInit(); 

     imgAsset.Source = imgTemp; 

risposta

33

Sei quasi arrivato.

  • Utilizzo di BitmapCacheOption.OnLoad è la soluzione migliore per impedire il blocco del file.

  • Per farlo rileggere il file ogni volta che è necessario aggiungere BitmapCreateOptions.IgnoreImageCache.

L'aggiunta di una riga al tuo codice dovrebbe farlo:

imgTemp.CreateOption = BitmapCreateOptions.IgnoreImageCache; 

quindi con conseguente questo codice:

uriSource = new Uri(Combine(imagesDirectoryTemp, generatedFileName), UriKind.Absolute); 
    imgTemp = new BitmapImage(); 
    imgTemp.BeginInit(); 
    imgTemp.CacheOption = BitmapCacheOption.OnLoad; 
    imgTemp.CreateOptions = BitmapCreateOptions.IgnoreImageCache; 
    imgTemp.UriSource = uriSource; 
    imgTemp.EndInit(); 
    imgAsset.Source = imgTemp; 
+0

Perfetto, molte grazie per questo. – 4imble

+1

imgTemp.CreateOption dovrebbe essere imgTemp.CreateOptions –

0

suona molto come il problema che avevo in via di sviluppo Intuipic, dove WPF non smaltire dell'immagine, bloccando in tal modo il file. Controlla this converter Ho scritto per risolvere il problema.

+0

Ciao, grazie per questo, non sono più la generazione di un errore ma dopo l'aggiornamento la fonte dell'immagine non si sta aggiornando. Ho bisogno di smaltire qualcosa secondo il tuo esempio o devo far in modo che l'origine delle immagini si aggiorni in qualche modo? Grazie. – 4imble

1

Quando si carica un'immagine in un controllo WPF, gestiamo l'immagine e non la rilascia finché non chiudi l'applicazione. La ragione di questo ... non so esattamente, problably è stabulazione su un codice DirectX dietro la scena, che non sa mai quando le versioni delle applicazioni WPF l'immagine .. Usa questo codice per caricare l'immagine ..

 MemoryStream mstream = new MemoryStream(); 
     System.Drawing.Bitmap bitmap = new Bitmap(imgName); 
     bitmap.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg); 
     bitmap.Dispose(); // Releases the file. 

     mstream.Position = 0; 

     image.BeginInit(); 
     image.StreamSource = mstream; 
     image.EndInit(); 
     this.img.Source = image ; 

ha funzionato per me ..

+0

Funziona ma è molto meno efficiente dell'uso di BitmapCacheOptions.OnLoad e BitmapCreateOptions.IgnoreImageCache perché: 1. Mantiene due copie dei dati nella RAM, 2. È più lento perché durante l'estrazione di System è presente parecchia elaborazione e elaborazione. Chiamata .Bitmap.Save. Inoltre, non funzionerà se imgName è un URI gestito solo da WPF. –

Problemi correlati