2009-11-06 16 views
9

Buenos días todos,Problemas al sobrescribir (volver a guardar) la imagen cuando se configuró como fuente de la imagen

Tengo problemas con los permisos de las imágenes.

Estoy cargando una imagen del archivo, cambiándola de tamaño y luego guardándola en otra carpeta. Estoy a continuación, que exhiben este modo:

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

    imgAsset.Source = new BitmapImage(uriSource); 

Esto está trabajando muy bien, el problema viene si el usuario selecciona entonces otra imagen inmediatamente después y trata de guardarlo en el archivo original.

Una excepción se genera al guardar mi imagen "ExternalException: A generic error occurred in GDI+."

Después de algún juego en torno he estrechado el error hasta imgAsset.Source = new BitmapImage(uriSource); como la eliminación de esta línea y no se establece el Imagesource me permitirá sobrescribir este archivo muchas veces.

También intenté configurar el origen en otra cosa, antes de volver a guardarlo con la esperanza de que la referencia anterior fuera eliminada, este no era el caso.

¿Cómo puedo superar este error?

Gracias, Kohan

Editar

Ahora, utilizando este código no estoy recibiendo la excepción sin embargo, el origen de la imagen no se actualiza. Además, dado que no estoy usando un SourceStream, no estoy seguro de qué tengo que deshacerme para que funcione.

 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; 

Respuesta

33

Ya casi está.

  • El uso de BitmapCacheOption.OnLoad fue la mejor solución para evitar que su archivo se bloquee.

  • Para que vuelva a leer el archivo cada vez que también necesita agregar BitmapCreateOptions.IgnoreImageCache.

Adición de una línea a su código debe hacerlo:

imgTemp.CreateOption = BitmapCreateOptions.IgnoreImageCache; 

por lo tanto resulta en este código:

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

Perfecto, muchas gracias por esto. – 4imble

+1

imgTemp.CreateOption debe ser imgTemp.CreateOptions –

0

se parece mucho a la que había un problema de desarrollo Intuipic, donde WPF no dispondría de la imagen, bloqueando de este modo el archivo. Consulte this converter que escribí para tratar el problema.

+0

Hola, gracias por eso, ya no estoy generar un error pero después de la actualización, la fuente de la imagen no se está actualizando. ¿Debo deshacerme de algo según su ejemplo o necesito hacer que el imagesource se actualice de alguna manera? Gracias. – 4imble

1

Cuando carga una imagen en cualquier control de WPF, manejaremos su imagen y no la liberaremos hasta que cierre la aplicación. La razón de esto ... No sé exactamente, problably está retransmitiendo en algún código DirectX detrás de la escena que nunca se sabe cuando la aplicación libere WPF la imagen .. Usar este código para cargar la imagen ..

 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 ; 

funcionó para mí ...

+0

Esto funciona pero es mucho menos eficiente que usar BitmapCacheOptions.OnLoad y BitmapCreateOptions.IgnoreImageCache porque: 1. Mantiene dos copias de los datos en la RAM, 2. Es más lento porque hay mucho análisis y procesamiento durante el System.Drawing .Bitmap.Guardar llamada. Tampoco funcionará si imgName es un URI que solo maneja WPF. –

Cuestiones relacionadas