venerdì 23 febbraio 2007

Ridimensionare Immagini con VB.NET e GDI

In .NET è presente tutta una gerarchia di metodi dedicati al trattamento delle immagini piuttosto semplice da utilizzare e decisamente comoda. Le potenzialità di System.Drawing (questo è il namespace .NET dedicato alle immagini) sono molto ampie ma, nello scenario di un programmatore medio, il tutto si riduce spesso al ridimensionamento di un’immagine per rispettare una determinata dimensione o al più per la realizzazione di una miniatura.

Ridimensionare un’immagine in .NET è facilissimo e si realizza così:


Dim ImmaginePiccola As Image
Dim ImmagineGrande As Bitmap

ImmagineGrande = New Bitmap("C:\Documenti\Immagini\foto.jpg")
ImmaginePiccola = New Bitmap(ImmagineGrande, Larghezza, Altezza)


Questo sistema è di facilissima implementazione e può andare bene per la maggioranza delle applicazioni ma ha un limite qualitativo causato dal sistema utilizzato di default da GDI per il ridimensionamento delle immagini, che è un’interpolazione lineare.

L’interpolazione, per dirla in maniera semplicistica, è un processo matematico che consiste nell’individuazione di un punto nello spazio a partire da due punti iniziali. Nel processo di ridimensionamento di un’immagine, l’interpolazione permette di individuare i colori dell’immagine, punto per punto partendo dall’immagine originale, e di ricostruire la nuova immagine con le nuove dimensioni. Esistono diversi tipi di funzioni di interpolazione che variano da quella lineare (molto veloce ma meno accurata), a quella bicubica, più lenta ma decisamente più accurata.

L’interpolazione lineare ha il vantaggio di essere molto rapida e funziona generalmente bene quando si effettuano ridimensionamenti di piccola entità. Quando il ridimensionamento supera il 50% della dimensione originale dell’immagine cominciano a vedersi artefatti nell’immagine che risulta comunque più sgranata e decisamente meno piacevole alla vista rispetto ad un’immagine trattata con la funzione di interpolazione bicubica.

Per effettuare il ridimensionamento di un’immagine con GDI e la funzione di interpolazione bicubica (la stessa usata di default da Photoshop per capirci), il codice si complica leggermente e per non appesantire la lettura vi invito a visualizzare il codice a questo link.

La differenza tra i due metodi è ben visibile dalle immagini qui sotto e secondo me si commenta da sola.



Aggiornamento: Ho messo in linea una classe per il trattamento delle immagini (vedi post)

1 commento:

Maurizio Picone ha detto...

Complimenti.
Io l'ho utilizzata così:

' ========================
' RESIZE 100x100
' ========================
Dim ImmagineGrande As Bitmap
Dim ImmagineGrande = New Bitmap(Server.MapPath(PercorsoVirt_JPG))

Dim nuovagrandezza As New System.Drawing.Size nuovagrandezza.Width = 100
nuovagrandezza.Height = 100

Dim ImmaginePiccola As Bitmap
ImmaginePiccola = ResizeImage(ImmagineGrande, nuovagrandezza, True)
ImmaginePiccola.Save(Request.MapPath("foto\") & "_RESIZE.JPG")


L'unica cosa che non riesco a capire è perchè mi va in errore se prelevo l'immagine originale da D:\ !