15 messaggi dal 14 marzo 2011
Buonasera a tutti.
Vorrei creare un'immagine trasparente su cui disegnare con gdi+. Ecco il codice in Default.aspx:
<%@ Page Language="VB" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
  <title>Test</title>
</head>
<body bgcolor="Aqua">
  <form id="form1" runat="server">
    <img id="Immagine" src="Sample1.aspx" alt="Sample" height="200" width="400" />
  </form>
</body>
</html>


Ho messo un bgcolor Aqua per vedere se la trasparenza funziona oppure no. E questo è il codice in Sample1.aspx:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Sample1.aspx.vb" Inherits="Sample1" %>


E in Sample1.aspx.vb:
  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim pic As New System.Drawing.Bitmap(400, 200, PixelFormat.Format32bppArgb)
    Dim g As Graphics = Graphics.FromImage(pic)
    g.Clear(Color.FromArgb(255, 255, 255, 255))
    Dim rect As New Rectangle(Point.Empty, pic.Size)
    g.DrawEllipse(Pens.Red, rect)
    g.Dispose()

    Response.ContentType = "image/gif"
    pic.Save(Response.OutputStream, ImageFormat.Gif)
    pic.Dispose()
  End Sub


Per funzionare funziona, ma non ho la trasparenza. Infatti vedo lo sfondo bianco dell'immagine, invece che Aqua. Qualcuno ha qualche idea?
Grazie
Massimo
11.886 messaggi dal 09 febbraio 2002
Contributi
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 -

Enjoy learning and just keep making
15 messaggi dal 14 marzo 2011
E' perfetto!!
Funziona bene, e grazie anche per la dritta dell'HttpHandler, che non conoscevo.
Massimo

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.