18 messaggi dal 16 marzo 2005
Salve a tutti, è la prima volta che scrivo, anche se da tempo leggo il forum.
Ho scritto una pagina che contiene tre immagini generate dinamicamente e che vengono inviate attraverso lo stream di output tramite l'istruzione:
bmp.Save(Response.OutputStream, imageCodec, encParams)
(dove bmp è un oggetto bitmap e l'immagine è di tipo jpeg con fattore di qualità 55)
La dimensione dell'immagine (tasto destro, proprietà), una volta visualizzata nel browser risulta circa 30K.
Dato che mi sembrava troppo per una immagine 180x180 e vorrei ridurre la quantità di dati inviati, ho fatto la seguente prova: ho sostituito l'istruzione precedente con:
bmp.Save(MapPath("~/immagini/pippo.jpg"), imageCodec, encParams)
in modo da salvare sul server l'immagine e poi ho cambiato il tag del controllo img in modo da puntare al file "pippo.jpg"
Risultato: la dimensione dell'immagine è ora solo 6K !!! (ed apparentemente la qualità è identica!)
Come mai? Esiste effettivamente differenza nella quantità di dati binari inviati al client o dipende solo da come vengono calcolati i bytes della dimensione dell'immagine?
Se esistesse davvero tutta quella differenza, come posso evitare di passare attraverso il file system ed inviare direttamente tramite lo stream l'immagine ridotta?
Grazie
Sandro
ISW256 wrote:
Come mai? Esiste effettivamente differenza nella quantità di dati binari inviati al client o dipende solo da come vengono calcolati i bytes della dimensione dell'immagine?

dipende dalla compressione utilizzata, perchè JPEG è un formato con perdità di qualità. più comprimi, meno pesa, minore è la qualità. su certe immagini si nota meno (dipende da cosa visualizza), su altre di più e non esiste una % che vada bene per tutti i casi. infine, spesso i programmi di fotoritocco salvano senza compressione e quindi quei 30 kb possono essere rappresentativi di questa eventualità.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
18 messaggi dal 16 marzo 2005
Ciao Daniele, scusa ma non mi sono spiegato bene.
L'immagine jpeg la genera il codice asp.net utilizzando la GDI+ leggendo i dati da un database (è un grafico dell'andamento della temperatura e velocità del vento)
L'immagine viene generata "al volo" e inviata al client (browser) utilizzando lo stream di output dell'oggetto Response
Misurando il numero di bytes il broser mi dice 30K (explorer 7)
Ma se, nello stesso codice, aggiungo anche il salvataggio su disco (con la stessa istruzione save dell'oggetto bitmap ma su file) e poi linko questa immagine nella stessa pagina, ora la dimensione è di soli 6K
Perchè?
Nota: non uso nessun software per fare l'edit dell'immagine, è generata in entrambi i casi dal codice!
Quello che mi chiedo è perchè o come fare ad inviare al broser tramite lo stream di output l'immagine di 6K senza doverla prima "parcheggiare" sul disco.
Sandro
isw256 wrote:
Quello che mi chiedo è perchè o come fare ad inviare al broser tramite lo stream di output l'immagine di 6K senza doverla prima "parcheggiare" sul disco.

il codice è esattamente lo stesso? può essere un problema del browser, prova con un altro, perchè lo stream in cui andare a scrivere credo sia lo stesso. prova anche a salvare su disco locale questa immagine generata al volo e vedere quanto occupa.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
18 messaggi dal 16 marzo 2005

il codice è esattamente lo stesso? può essere un problema del browser, prova con un altro, perchè lo stream in cui andare a scrivere credo sia lo stesso. prova anche a salvare su disco locale questa immagine generata al volo e vedere quanto occupa.


Si, lo stesso. Appena rientro posto il codice esatto.
Le istruzioni sono grossomodo:
bmp.Save(Response.OutputStream, imageCodec, encParams)
e subito dopo
bmp.Save(MapPath("~/immagini/pippo.jpg"), imageCodec, encParams)

quindi l'oggetto bmp è lo stesso, il metodo (save) è lo stesso, ma l'output è diverso!

Ho anche provato ad aprire l'immagine salvata ed inviarla allo stream di Response e mantiene sul browser le dimensioni ridotte!

Posterò il codice esatto e un link alla pagina incriminata...
Grazie
Sandro
18 messaggi dal 16 marzo 2005
Ecco il codice:

Dim bmp As Bitmap
bmp = New Bitmap(sx, sy, Imaging.PixelFormat.Format24bppRgb)
Dim gr As Graphics = Graphics.FromImage(bmp)
gr.Clear(Color.FromArgb(&HEF, &HF3, &HFB))
gr.ResetTransform()
....
istruzioni che creano il grafico
....
gr.Dispose()
Response.Clear()
Response.ContentType = "image/jpeg"
bmp.Save(Response.OutputStream, Imaging.ImageFormat.Jpeg)
bmp.Save(MapPath("~/immagini/pippo.jpg"), Imaging.ImageFormat.Jpeg)
bmp.Dispose()
Response.Flush()

Nella pagina poi viene visualizzata sia l'immagine proveniente dallo stream sia quella dal link al file pippo.jpg: la prima è di 30K, la seconda di 6K...
E' probabile che il metodo save su file effettui qualche forma di ottimizzazione dei colori o altro che invece sullo stream non viene fatta.
Molto strano!
Peccato che così vengano inviati 100K per pagina (visualizzo tre grafici) mentre ne basterebbero 20 scarsi.... :-(
Qualche idea?
Sandro
ISW256 wrote:
Nella pagina poi viene visualizzata sia l'immagine proveniente dallo stream sia quella dal link al file pippo.jpg: la prima è di 30K, la seconda di 6K...

non è che hai la compressione attiva su IIS per i file statici? il metodo Save salva nello stesso modo a prescindere da dove lo fa, l'unico altro motivo, a parte la compressione, potrebbe essere che il browser non riceve correttamente il file.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
141 messaggi dal 21 febbraio 2002
www.melisweb.eu
Hai provato a metter un response.End dopo il Response.Flush()? Se no erro la pagina continua ad essere costruita e poi inviata.... forse i Kb in + sono questo "pattume"?

Andrea Melis
http://www.melisweb.eu/
http://www.puntodidomanda.com/
http://www.andiamo.it/
http://www.my-hotel.it/
http://www.cucinamore.com/

MSN: amelix@msn.com

]aMelix[
-------------------------------
http://www.melisweb.eu/
http://www.puntodidomanda.com/
http://www.cucinamore.com/
-------------------------------

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.