Problemi col salvataggio delle immagini png in Asp.net
Quanti di noi abbiamo avuto la necessità di inserire all'interno del nostro content di una richiesta un'immagine, magari in formato Png? Come molti di voi sapranno, questa tecnica viene spesso utilizzata nel caso dovessimo restituire al client un'immagine creata al volo (un esempio pratico è la creazione dell'immagine captcha). Per far ciò si richiama una pagina, ad esempio aspx, la quale inserirà nel content l'immagine, trasformando ovviamente il content-type nell'opportuno formato (image/png). In questo modo la nostra pagina non verrà più trattata come testo ma come immagine. Vediamo come fare ciò:
image = OtpImageRes.otpCanc;
image.MakeTransparent();
image.Save(Response.OutputStream, ImageFormat.Png);
image.Dispose();
Questo spezzone di codice altro non fa che recuperare dalle risorse l'immagine e inserirlo nell'outputStream nella nostra richiesta. Tutto molto semplice per l'appunto. Fin troppo però. Infatti se ad esempio in iss7, o nel server di debug inserito in visual studio, Questo spezzone di codice potrebbe non generare nessun problema, tale cosa non è vera negli altri casi.
A generic error occurred in GDI+
Può succedere che facendo partire la nostra applicazione, invece che la nostra bella immagine si presenti tale errore: "A generic error occurred in GDI+". Tale errore, leggendo nel web, viene generato nel caso non vi siano dei permessi nella cartella in cui stiamo salvando. Ma nel nostro caso non può essere così, visto che non andiamo a salvare la nostra immagine su filesystem ma direttamente all'interno del flusso della nostra richiesta. Come fare allora? Per trovare la risposta mi son dovuto girare l'intero web per una mattina intera, ma alla fine l'ho trovata e ve la posto qua per tutti voi lettori.
La risposta è molto più semplice di quel che può sembrare. Semplicemente non è possibile inserire l'immagine (in formato png) direttamente all'interno del flusso. Ok, a questo punto vi direte quale soluzione adottare. la più semplice è: adotta un altro formato. certo, fin troppo semplice però. Talmente semplice che comporta dei svantaggi, come ad esempio il fatto di non permettere la trasparenza.
Guardiamo questo nuovo spezzone di codice:
ms = new MemoryStream();
Bitmap image
Response.ContentType = "image/png";
image = OtpImageRes.otpCanc;
image.MakeTransparent();
image.Save(ms, ImageFormat.Png);
ms.WriteTo(Response.OutputStream);
image.Dispose();
Qua, molto semplicemente, andiamo a salvare la nostra immagine in memoria per poi dirgli che dev'essere inviata tramite il flusso della risposta Web.
Nel caso riscontriate dei problemi nell'utilizzo di tale soluzione scrivete pure nel forum, ovviamente dopo esservi registrati nel caso non lo siate.



