Problemi di sovrascrittura (ri-salvataggio) dell’immagine quando è stata impostata come sorgente immagine

Buona giornata a tutti

Sto avendo qualche problema con i permessi delle immagini.

Sto caricando un’immagine da file, ridimensionandola e salvandola in un’altra cartella. Quindi visualizzo questo in questo modo:

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

Funziona bene, il problema si presenta se l’utente seleziona un’altra immagine immediatamente dopo e prova a salvarla sul file originale.

Un’eccezione viene generata al salvataggio della mia immagine "ExternalException: A generic error occurred in GDI+."

Dopo aver giocato, ho ridotto l’errore a imgAsset.Source = new BitmapImage(uriSource); poiché rimuovere questa riga e non impostare l’origine delle immagini mi consentirà di sovrascrivere questo file molte volte.

Ho anche provato a impostare la sorgente su qualcos’altro, prima di ri-risparmiare nella speranza che il vecchio riferimento fosse smaltito, non era così.

Come posso superare questo errore?

Grazie, Kohan

modificare

Ora usando questo codice non ottengo l’eccezione, tuttavia la sorgente dell’immagine non si 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; 

Ci sei quasi.

  • L’utilizzo di BitmapCacheOption.OnLoad è stata la soluzione migliore per impedire il blocco del file.

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

Aggiungere una riga al tuo codice dovrebbe farlo:

  imgTemp.CreateOption = BitmapCreateOptions.IgnoreImageCache; 

risultando così in 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; 

Quando carichi un’immagine in qualsiasi controllo WPF, gestiamo l’immagine e non la rilascia finché non chiudi l’applicazione. La ragione per questo … Non so esattamente, probabilmente si sta inoltrando su qualche codice DirectX dietro la scena che non sa mai quando l’applicazione WPF rilascia 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 ..

Sembra molto simile al problema che avevo sviluppato Intuipic , in cui WPF non avrebbe eliminato l’immagine, bloccando così il file. Guarda questo convertitore che ho scritto per risolvere il problema.