Recuperare le informazioni dei file .jpg per elaborare le immagini


Riccardo Ufilugelli mi fa questa domanda:

Sai se è possibile conoscere le proprietà di un file "JPG" da comandi VBA?
Ti spiego il mio quesito:  in una form di una cartella xls ho inserito, tramite la casella degli strumenti, il controllo "immagine1". In questo controllo voglio inserire delle foto in formato "jpg".
Se la foto è stata scattata in orizzontale nessun problema dal rapporto 4:3, 3:2, ecc della foto dimensiono il controllo "immagine1".  Il problema nasce con le foto scattate in verticale (il cui rapporto è invertito 3:4, 2:3, ecc) se utilizzo lo stesso controllo "immagine1" ottengo, in visualizzazione, una deformazione della foto.
Ecco la mia domanda: come faccio a sapere se la foto (tramite le proprietà della foto stessa) è stata scattata in orizzontale o verticale e quindi associare un controllo "immagine2" opportunamente dimensionato per le foto verticali.

Effettivamente il problema non è banale in quanto richiede di analizzare il file .jpg prima di caricare l'immagine. Riccardo ha posto la stessa domanda anche a Gianni Giaccaglini che propone questa soluzione veramente carina ed efficace:

Function RappDimImmagine(FileImg As String) As Double
  Sheets.Add
  ActiveSheet.Pictures.Insert (FileImg)
  With ActiveSheet.Shapes(1)
    ratio = .Height / .Width
  End With
  Application.DisplayAlerts = False 'Elimina il foglio aggiuntivo senza proteste
  ActiveSheet.Delete
  RappDimImmagine = ratio
End Function

Sub TestRappDimImg()
  MsgBox RappDimImmagine("C:\Documents and Settings\giaccaglini\Documenti\Immagini\Micio.jpg")
End Sub

La procedura funziona molto bene e funziona in questo modo: crea un foglio nuovo di supporto, carica l'immagine così come si trova sul disco, ne verifica le dimensioni, calcola il rapporto d'aspetto e butta via l'immagine utilizzata. La procedura è efficace e funziona bene ma è un po' macchinosa.

Riccardo invece propone una differente versione che si basa sull'algoritmo di David Crowell (il cui algoritmo per VB è disponibile all'indirizzo http://www.freevbcode.com/ShowCode.Asp?ID=112) ed è disponibile per  download all'indirizzo:


L'algoritmo va a leggere direttamente in formato binario i file .jpg e ad estrarne le proprietà. Di fatto legge le informazioni del file senza bisogno di caricare l'immagine e dunque risulta molto più veloce e agile.

Espirimiamo i nostri sinceri complimenti sia a Riccardo Ufilugelli sia a Gianni Giaccaglini per le loro splendide realizzazioni. Non avremmo saputo fare di meglio!

Link correlati: il blog di gianni Giaccaglini: http://blog.shareoffice.it/giannigiaccaglini/