J'ai un problème dans une application Windows Forms avec Bitmap.Sauvegarde échouant lorsque je l'enregistre dans un MemoryStream. Le problème semble seulement se produire par intermittence sur une machine (jusqu'à présent) et la mauvaise nouvelle est sur un site client. Je ne peux pas déboguer sur la machine, mais j'ai une trace de pile qui réduit le problème à une seule ligne de code.GDI + exception sauvegarde un bitmap à un MemoryStream
Voici une version condensée de mon code:
byte[] ConvertPixelsToBytes()
{
// imagine a picture class that creates a 24 bbp image, and has
// a method to get an unmanaged pixel buffer.
// imagine it also has methods for getting the width,
// height, pitch
// I suppose this line could return a bad address, but
// I would have expected that the Bitmap constructor would have
// failed if it was
System.IntPtr pPixels = picture.GetPixelData();
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(
picture.width(),
picture.height(),
picture.pitch(),
System.Drawing.Imaging.PixelFormat.Format24bppRgb,
pPixels);
// This line doesn't actually free the memory, but it could be freed in a
// background thread
// (2)
picture.releasePixelData(pPixels);
System.IO.MemoryStream memStream = new System.IO.MemoryStream();
try
{
// I don't see how this line could fail, but it does
// (3)
bmp.Save(memStream, System.Drawing.Imaging.ImageFormat.Bmp);
return memStream.ToArray();
}
catch(System.Runtime.InteropServices.ExternalException e)
{
// e.Message is the very helpful " A generic error occurred in GDI+."
}
finally
{
memStream.Dispose();
}
return new byte[0];
}
Toute idée de ce qui pourrait se passer? Je suis sûr que mon tampon de pixels est bon, il fonctionne toujours sur nos machines de développement/test et sur d'autres sites clients.
Mes réflexions sur les raisons possibles de l'échec sont
a. Le constructeur de bitmap ne copie pas les données de pixel, mais conserve une référence, et l'enregistrement échoue car la mémoire est libérée. Je ne trouve pas les documents MSDN claires sur ce point, mais je suppose que le bitmap copie les données de pixel plutôt que de supposer qu'il est verrouillé.
b. Les données de pixel ne sont pas valides et entraînent l'échec de la méthode Save. J'en doute car les données de mes pixels sont de 24 bits par pixel, donc pour autant que je sache, cela ne devrait pas être invalide.
c. Il y a un problème avec le framework .NET. J'apprécierais toute réflexion sur d'autres raisons possibles de défaillance afin que je puisse ajouter des contrôles supplémentaires et des informations de connexion à mon application afin que je puisse envoyer quelque chose sur le terrain.
Une exception particulière? Ou est-ce une de ces exceptions "A Gerneic GDI + error has been"? –
C'est l'une de ces exceptions "Generic GDI +". –