martedì 27 febbraio 2007

Una Classe in .NET per la gestione delle immagini

Girando un pò per i vari forum ho notato che ultimamente, un quesito molto diffuso riguarda il trattamento delle immagini soprattutto in relazione ad operazioni di ridimensionamento (riduzione di altezza e larghezza dell'immagine) o ricampionamento (riduzione del peso in Kb dell'immagine aumentando il fattore di compressione).

Recentemente ho lavorato ad un progetto nel quale avevo proprio l'esigenza di accettare come input delle immagini inviate dagli utenti, processarle e ridimensionarle tutte ad una dimensione standard. Per comodità e nella consapevolezza che prima o poi avrei nuovamente avuto bisogno di funzionalità del genere ho deciso di racchiudere queste routine in una classe .NET che potessi poi utilizzare in diversi scenari.

Ho deciso di rendere liberamente disponibile questa classe sperando che possa essere utile a qualcuno. E' possibile scaricare la dll compilata da questo indirizzo oppure il file di progetto di Visual Studio 2005 con i sorgenti da quest'altro.

Le funzionalità della classe attualmente sono molto specifiche e si traducono in una serie di metodi dedicati al ridimensionamento di un'immagine e al relativo salvataggio. E' possibile determinare altezza e larghezza della nuova immagine, il formato in cui salvarla e il rapporto di compressione da utilizzare.

Ho dedicato particolare attenzione alla qualità delle immagini e ho faticato non poco per riuscire ad ottenere immagini trattate che potessero essere paragonate ad immagini ridimensionate con Photoshop. Le immagini trattate con i metodi di default di GDI risultano nettamente più sporche delle stesse immagini trattate con un software di gestione immagini perché GDI di default usa un’interpolazione lineare. ArtLabs.Pictures (questo è il nome e il namespace della classe di cui parlo) applica di default il sistema dell’interpolazione bicubica (per un confronto tra i due metodi di compressione vedi Ridimensionare Immagini con GDI).

Come tutte le classi di codice puro in .NET, ha la comodità di poter essere utilizzata in maniera immediata sia in applicazioni Windows, sia in applicazioni Web Based e quindi richiamandola da una pagina aspx.

Utilizzarla in un sito asp.net è molto semplice, è sufficiente estrarre la dll, copiarla nella cartella BIN del vostro sito e aggiungere il relativo riferimento. A questo punto il codice da utilizzare all'interno delle vostre routine è il seguente:


Dim artObj = As ArtLabs.Pictures.Engine
artObj = New ArtLabs.Pictures.Engine

artObj.ResizeToFile(server.MapPath("/image.jpg"), _
server.MapPath("/target.jpg"), _
New Size(200, 200), _
System.Drawing.Imaging.ImageFormat.Jpeg, True, 80)

artObj.Dispose()
artObj = Nothing


Se qualcuno decidesse di provarla, avrei piacere di leggere i suoi commenti o suggerimenti.

7 commenti:

Unknown ha detto...

Per l'utilizzo della dll in asp?
Se possibile, quali sono e come devo passare i parametri?

Grazie
David

Unknown ha detto...

Wooow! Davvero interessante come componente!
Soprattutto perchè hai strizzato l'occhio alla qualità delle immagini, a differenza di molti altri script o componenti che si trovano in giro..

Sinceramente non sono per nulla pratico di asp.net ma sto cercando di implementare un resize sulle immagini in un sito asp classico e quindi mi servirebbe una pagina .net per fare il resize.

Il tuo componente mi sembra l'ideale ma ho qualche difficoltà di implementazione:
Copio il file dll nella cartella BIN del sito, creo una nuova pagina aspx, importo il namespace ArtLabs.Pictures e inserisco il codice da te consigliato. Eseguendo mi salta fuori il seguente errore:


Errore di compilazione
Descrizione: Errore durante la compilazione di una risorsa necessaria per soddisfare la richiesta. Rivedere i dettagli relativi all'errore e modificare in modo appropriato il codice sorgente.

Messaggio di errore del compilatore: BC30201: Prevista espressione.

Riga 10: script runat="server"
Riga 11: Dim artObj= As ArtLabs.Pictures.Engine
Riga 12: artObj = New ArtLabs.Pictures.Engine
Riga 13:

Simone ha detto...

Per francesco:
ho risposto alla tua domanda in questo post:
http://forum.html.it/forum/showthread.php?s=&threadid=1094913

Per davids:
non ho idea... non ho idea di come far funzionare una dll compilata in .NET in ASP Classico, mi dispiace. Ho provato diverso tempo fa a far girare dll .NET in progetti VB6 e ci sono riuscito, non ho mai provato però con ASP.

Anonimo ha detto...

M-I-T-I-C-O

grazie mille Simone, mi hai risparmiato un bel pò di grattacapi e tempo! Ottimo lavoro!

Appena integrata in un'applicazione VB.net con Vs 2005, in meno di 5 minuti.

Yappppiiiiii ^_____^

Ciao, Auri

Anonimo ha detto...

ciao simo,
complimenti innanzitutto.

Sto cercando un modo per far sì, con l'utilizzo della tua classe, di caricare le immagini e di fare il resize dopo l'upload. Fino a qui tutto bene ... solo non riesco a fargli prendere le dimensioni che vorrei, ecco il codice che uso:

Dim strFileName As String = imgfile.PostedFile.FileName
strFileName = System.IO.Path.GetFileName(strFileName)

imgfile.PostedFile.SaveAs(Server.MapPath("/public/" & strFileName))

Dim x As ArtLabs.Pictures.Engine
x = New ArtLabs.Pictures.Engine

x.ResizeToFile(Server.MapPath("/public/" & strFileName), Server.MapPath("/public/2" & strFileName), New System.Drawing.Size(80, 105), System.Drawing.Imaging.ImageFormat.Jpeg, True, 100)
x.Dispose()
x = Nothing

Vorrei che le immagini piccole siano 80x105 invece lui le ridimensiona mantenendo le proporzioni, cosa che vorrei evitare.
C'è qualcosa nella classe per gestire queste situazioni?

Grazie

Anonimo ha detto...

.. niente ho trovato, bastava mettere False il parametro "MaintainAspect" ..

:P

Anonimo ha detto...

Ottimo lavoro, era proprio quello che cercavo! funziona egregiamente e senza alcuna difficoltà di adattamento al mio sito. grazie!