2010-03-12 4 views
5

Tengo un dll de terceros que genera un mapa de bits y devuelve su referencia. Si genero un System.Windows.Media.Imaging.BitmapSource inmediatamente, todo va bien. Pero si salvo la referencia y más tarde (después de unos segundos y muchas llamadas de función) Trato de generar el BitmapSource, consigo¿No es confiable pasar System.Drawing.Bitmap a través de las bibliotecas de clase?

System.AccessViolationException era no controlada por el código de usuario
Mensaje = Intento de leer o escriba memoria protegida. A menudo, esta es una indicación de que otra memoria está corrupta . Fuente = "System.Drawing"

cuando se hace:

System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
    bmp.GetHbitmap(), 
    IntPtr.Zero, 
    Int32Rect.Empty, 
    System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 

Alguna pista sobre qué se está mal aquí? Cualquier puntero será útil. Gracias.

Respuesta

3

que tenían un gran problema con los mapas de bits y violaciónes de acceso también. Lo que creo que está sucediendo es que ciertos constructores de mapas de bits dejan los identificadores de archivos abiertos cuando no deberían. Por lo tanto, el programa que está ejecutando detecta que los archivos están en uso, cuando no deberían.

Finalmente encontré una solución en la que hago una copia del mapa de bits original y luego desecho el original. Aquí está mi código, que conserva la resolución del mapa de bits original:

Bitmap Temp = new Bitmap(inFullPathName); 
Bitmap Copy = new Bitmap(Temp.Width, Temp.Height); 
Copy.SetResolution(Temp.HorizontalResolution, Temp.VerticalResolution); 
using (Graphics g = Graphics.FromImage(Copy)) 
{ 
    g.DrawImageUnscaled(Temp, 0, 0); 
} 
Temp.Dispose(); 
return Copy; 

Obviamente, para la primera línea, la suya sería Temperatura de mapa de bits = MyThirdPartyDLL.GetBitmap(); o algo. Si no se preocupan por la resolución que se puede simplificar a:

Bitmap Temp = MyThirdPartyDLL.GetBitmap(); 
Bitmap Copy = new Bitmap(Temp, Temp.Width, Temp.Height); 
Temp.Dispose(); 
return Copy; 

Después de hacer este cambio, yo era capaz de hacer todo tipo de archivo de E/S, etc., perfectamente bien, la esperanza puede hacer lo mismo.

+0

Lo sentimos, no tiene nada que ver con los identificadores de archivo. Ver la respuesta de Andras para la explicación correcta. Sin embargo, me gustó su solución para copiar un mapa de bits para evitar el error (+1). Si las estructuras internas de datos de mishal153 requieren un Mapa de bits en lugar de un BitmapSource, debería usar el código como el que publicó. De lo contrario, lo mejor sería crear el BitmapSource de forma inmediata en lugar de crear un nuevo mapa de bits. –

+1

Hola Brandi, Tus sugerencias funcionan como una canción :). ¡Gracias! Intentaba hacer lo mismo, pero la forma en que lo hacía era: 'newBmp = oldBmp.Clone(); La documentación del clon decía "Crea una copia exacta de esta imagen", así que pensé que había hecho una copia profunda. Lo que es realmente confuso es que la documentación del constructor de Bitmap dice "Inicializa una nueva instancia de la clase Bitmap a partir de la imagen existente especificada", y eso suena como que simplemente envuelve la imagen existente, cuando de hecho está haciendo una profunda copia :) .Es solo yo o esto es confuso para otros también. gracias chicos – mishal153

+0

Me alegro de haber ayudado. :) – Brandi

4

Creo que esto indica que el identificador (referencia a un recurso administrado por el sistema operativo, en lugar de .Net) devuelto por bmp.GetHBitmap ya no es válido, posiblemente un Dispose ha sido llamado en algún lugar o algo así (no necesariamente por tu código sin embargo).

Recomendaría utilizar otra forma de persistir los datos de mapa de bits que no dependan de los identificadores, posiblemente transmitir inmediatamente los datos binarios del mapa de bits, y luego lanzar una referencia a eso.

Cuestiones relacionadas