Ciao,
le GIF non supportano il canale alpha quindi, salvando in quel formato, perdi eventuali (semi) trasparenze. L'unica cosa che potresti fare è designare uno dei colori dell'immagine, ma far questo sembra essere
un po' complicato e comunque non produrrebbe un risultato ottimale.
Dovresti lavorare con un formato che supporti il canale alpha, e questo formato è PNG. Prova in questo modo:
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim pic As New System.Drawing.Bitmap(400, 200, PixelFormat.Format32bppPArgb)
Dim g As Graphics = Graphics.FromImage(pic)
g.Clear(Color.Transparent) //questa linea puoi anche rimuoverla
Dim rect As New Rectangle(Point.Empty, pic.Size)
g.DrawEllipse(Pens.Red, rect)
g.Dispose()
context.Response.ContentType = "image/png"
Dim ms As New MemoryStream()
pic.Save(ms, ImageFormat.Png)
pic.Dispose()
context.Response.BinaryWrite(ms.ToArray())
End Sub
Puoi notare alcune differenze in questo codice:
- Ho usato Color.Transparent anziché Color.FromArgb(255, 255, 255, 255) per riempire lo sfondo. In realtà non ci sarebbe neanche bisogno di chiamare il metodo .Clear perché lo sfondo di un'immagine creata con PixelFormat.Format32bppPArgb è già trasparente.
In alternativa, sì, anche Color.FromArgb potrebbe essere usato purché nel primo valore tu inserisca 0. Infatti il canale alpha può assumere valori da 0 (perfettamente trasparente) a 255 (completamente opaco).
-
Non è possibile salvare le PNG direttamente nel Response.OutputStream, quindi mi sono dovuto appoggiare ad un System.IO.MemoryStream, e poi riversare i suoi byte nella response.
- Anziché scrivere questo codice in Page_Load di una pagina aspx, l'ho inserito nel ProcessRequest di un HttpHandler (ashx). E' preferibile usare un HttpHandler perché è più "leggero" rispetto ad una pagina aspx. Infatti, per generare l'immagine non hai bisogno di tutte le funzionalità di una pagina aspx, come la Session, o gli eventi del suo ciclo di vita come Page_Init e Page_Load. Un HttpHandler ha un l'"evento" ProcessRequest che è perfettamente quello che ti serve, niente di più e niente di meno. E' ideale quando devi solo generare dell'output che non richiede l'interazione dell'utente, come per esempio un'immagine o un
feed RSS.
ciao,
Modificato da BrightSoul il 02 luglio 2011 14.19 -