C#, Visual Studio 2008, IIS7 : La Classe Bitmap, Les Images PNG Et System.Runtime.InteropServices.ExternalException

Voici un autre exemple de bogue apparaissant sous IIS7 alors que dans le serveur de test de Visual Studio 208.

Disons que vous avez besoin de modifier une image, pour la rendre plus sombre, plus claire, ou autre changement. Vous vous dîtes tiens il y a tout plein d’exemples de code c# qui trainent sur le Web, et il me suffit de concocter ma petite mixture en m’inspirant de 2 ou 3 de ces scripts.

Vous passez sous l’IDE Visual Studio 2008 et après une heure, tout s’exécute comme sur des roulettes. Mais en allant sur IIS7 vous obtenez une belle erreur du genre :

L’exception System.Runtime.InteropServices.ExternalException n’a pas été gérée
ErrorCode=-2147467259
Message="Une erreur générique s’est produite dans GDI+."
Source="System.Drawing"

Et l’erreur désigne la ligne où vous sauvegardez votre image modifiée :

Response.ContentType = "image/png";
bmp.Save(Response.OutputStream,ImageFormat.Png);

Après donc avoir vérifié que IIS7 (ou plutôt le compte Windows utilisé par IIS7) a bien tous les droits administrateur sur le répertoire où s’exécute le script, et de même que sur le répertoire où votre image sera sauvegardée (si c’est le cas), il vous a peut-être échappé que vous manipuliez une image PNG… Qui, comme tout le monde le sait, est gérée par la classe Bitmap un tout petit peu différement que les autres types d’images (JPEG, etc.).

Voici le code a utilisé pour les images PNG (il marche aussi avec les autres types d’images) :

MemoryStream MemStream=new MemoryStream();
Bitmap bitmap = new Bitmap(image);
// set the content type
Response.ContentType = "image/png";
//send the image to the memory stream then output
bitmap.Save(MemStream, System.Drawing.Imaging.ImageFormat.Png);
MemStream.WriteTo(Response.OutputStream);

Vous allez me demander qu’est ce que c’est que ce tour de passe-passe, où on sauve le fichier image bitmap d’abord dans un stream mémoire avant de le sauvegarder sur disque ou de l’afficher sur le navigateur? Réponse in english dans le texte, tellement c’est beau :

Png’s are a special case. Their encoder requires a bi-directional stream. The solution is to stream to a memory stream first and write the contents of that memory stream to OutputStream afterwards.

When you get to caching (which I’ve just implemented) you’ll be writing to a memory stream anyway just to cache the output, so this isn’t a big deal.

As far as the GIF end of things goes, the default palletization of the built in GIF encoder leaves something to be desired. I’ve built in support for an Octree quantizer to deal with this.

Seriously – it’s a lot of work. It’s probably easier if I just send you some code😉 ”.

Enjoy !!!

@+
rv.

Sources :
Streaming a PNG file into Response.OutputStream?
Une erreur générique s’est produite dans GDI+

A propos arcturien

E.T being from Arcturus Star System... ;-)
Cet article a été publié dans Ordinateurs et Internet. Ajoutez ce permalien à vos favoris.

Un commentaire pour C#, Visual Studio 2008, IIS7 : La Classe Bitmap, Les Images PNG Et System.Runtime.InteropServices.ExternalException

  1. Seb dit :

    lui il a reçu une pomme sur la tête avant de (même pas) donner son code…
    bien utile merci !

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s