2017-07-20 3 views
-1

L'image est en fait un tableau d'octets pompé à partir de ma DLL native (en tant que Byte *). Je le convertis en une image comme suit.Erreur générique survenue dans GDI + appelant Image.Save

Img = new Bitmap(g_Width, g_Height, g_Width * 3, PixelFormat.Format24bppRgb, ptr); 

Remarque: L '"Image" est dans la portée globale. "ptr" est un IntPtr (portée locale). Je tente d'enregistrer cette image à partir de la méthode BackgroundWorker. Quand je fais ainsi, j'obtiens "une erreur générique s'est produite dans GDI +" exception.

Qu'est-ce que je manque?

Edit:

Je suis en train d'enregistrer l'image comme

Img.Save("test.bmp", ImageFormat.Bmp); 

Aussi, j'ai essayé de sauver l'image dès que je crée l'image. Le fichier est enregistré avec succès. Je suis capable de montrer aussi bien. Mais je ne suis pas capable de sauver de l'ouvrier.

Modifier 2: Globals:

BackgroundWorker Worker; 
Image img = null; 

Le rappel est comme suit,

private unsafe void GrabFrame(Byte* InputBuff, ref Int32 lBufferLen) 
{ 
    Img = new Bitmap(g_Width, g_Height, g_Width * 3, 
     PixelFormat.Format24bppRgb, (IntPtr)InputBuff); 


    //Img.Save("test.bmp", ImageFormat.Bmp); // This works fine. 

    Worker = new BackgroundWorker(); 
    Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);        
    Worker.RunWorkerAsync(); 
} 

void Worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    try 
    { 
     Img.Save("test.bmp", ImageFormat.Bmp); //This is were i get the exception 
    } 
    catch (Exception ex) 
    { 
     Trace.WriteLine("Exception at Worker_DoWork: " + ex.Message); 
    } 
} 

code modifié:

Globals:

BackgroundWorker Worker; 
Image img = null; 
Byte[] g_Buffer; 
Intptr ptr; 

Le rappel est comme suit,

private unsafe void GrabFrame(Byte* InputBuff, ref Int32 lBufferLen) 
{ 
    Img = new Bitmap(g_Width, g_Height, g_Width * 3, 
     PixelFormat.Format24bppRgb, (IntPtr)InputBuff); 


    g_Buffer = new byte[lBufferLen]; 
    Marshal.Copy((IntPtr)InputBuff, g_Buffer, 0, lBufferLen); 

    //Img.Save("test.bmp", ImageFormat.Bmp); // This works fine. 

    Worker = new BackgroundWorker(); 
    Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);        
    Worker.RunWorkerAsync(); 
} 

void Worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    try 
    { 
     ptr = Marshal.AllocHGlobal(g_Buffer.Length); 
     Marshal.Copy(g_Buffer, 0, ptr, g_Buffer.Length); 

     Img = new Bitmap(g_Width, g_Height, g_Width * 3, PixelFormat.Format24bppRgb, ptr); 

     Img.Save("test.bmp", ImageFormat.Bmp); //still issue persists 

     // Call unmanaged code 
     Marshal.FreeHGlobal(ptr); 
    } 
    catch (Exception ex) 
    { 
     Trace.WriteLine("Exception at Worker_DoWork: " + ex.Message); 
    } 
} 

Edit 4: Code de travail

S'il vous plaît trouver le code modifié,

En rappel,

Byte[] Buffer = new Byte[lBufferLen]; 
Marshal.Copy((IntPtr)InputBuff, Buffer, 0, lBufferLen); 

Worker = new BackgroundWorker(); 
Worker.DoWork += (obj, e) => Worker_DoWork(obj, e, Buffer); 
Worker.RunWorkerAsync(); 

. Et le travailleur,

void Worker_DoWork(object sender, DoWorkEventArgs e, Byte[] Buffer) 
{ 
    try 
    { 
     Image Img = null; 
     IntPtr ptr = Marshal.AllocHGlobal(Buffer.Length); 

     Marshal.Copy(Buffer, 0, ptr, Buffer.Length); 

     if (ptr != IntPtr.Zero) 
     { 
      Img = new Bitmap(g_Width, g_Height, g_Width * 3, PixelFormat.Format24bppRgb, ptr); 
     } 

     Img.Save("test.bmp", ImageFormat.Bmp); 

     Marshal.FreeHGlobal(ptr); 
    } 
    catch (Exception ex) 
    { 
     Trace.WriteLine("Exception at Worker_DoWork: " + ex.Message); 
    } 
} 
+2

Il nous manque la commande save, y compris le chemin. Aussi: L'image fonctionne-t-elle, c'est-à-dire pouvez-vous l'afficher dans un PictureBox par exemple? – TaW

+0

@sam Veuillez fournir le code complet, y compris le travail et le retreivage de l'image. – vasek

+1

@sam 'GrabFrame' est un rappel d'un environnement non géré? Si c'est le cas, il est évident que votre employé asynchrone ne sauvegarde pas les données, car elles ont probablement déjà été libérées. Vous devez copier des données dans GrabFrame par exemple. géré 'byte []', puis enregistrez-le dans worker. – vasek

Répondre

-1

Merci @Vasek. Comme suggéré dans le commentaire, j'ai dû créer un tampon local et le passer au travailleur.

Veuillez trouver le code de travail dans la question éditée.