Correggere l'orientamento delle foto scattate con iPhone e/o Android con .NET C#

Correggere l'orientamento delle foto scattate con iPhone e/o Android con .NET C#

Se siete degli sviluppatori di app e/o vi capita di lavorare spesso con immagini che contengono fotografie scattate da cellulari e/o tablet conoscerete senz'altro il classico problema delle foto "orientate male", ovvero scattate con il dispositivo girato in una posizione particolare: la particolarità di queste foto è che tendono a visualizzarsi correttamente sul telefono e/o tablet, ma non sulla maggior parte degli applicativi e/o software desktop dove appaiono, per l'appunto, girate di 90, 180 o 270 gradi rispetto alla loro posizione ideale.

Il problema

Il motivo è semplice: al momento di scattare quelle foto, il dispositivo registra la posizione dell'accelerometro all'interno di un tag Exif apposito, che viene poi letto e utilizzato dalle app di visualizzazione per "correggere" in tempo reale l'orientamento dell'immagine. Questa operazione non viene però effettuata dalla maggior parte degli applicativi, software e componenti per PC, i quali si limitano a mostrare l'immagine così come è stata scattata senza effettuare nessuna correzione.

Perché, direte voi? Il motivo è piuttosto semplice: la quasi totalità dei software di elaborazione immagine per PC desktop, a differenza delle app per smartphone, è pensato per immagini e non (solo) per fotografie: i tag Exif, viceversa, sono metadati appositamente pensati per fotocamere digitali. Inoltre, la maggior parte dei suddetti software non è (ancora) pensato per avere a che fare con immagini provenienti da dispositivi dotati di accelerometro, quindi non controllano la presenza dei suddetti tag.

Situazione analoga si verifica anche per i componenti e le librerie di elaborazione immagine, comprese le soluzioni native come GDI+ e DirectX. Per fare un esempio, ogni volta che andremo ad importare una fotografia "diversamente orientata" in C# nel seguente modo, magari per elaborarla o ridimensionarla:

andremo di fatto a mantenere l'orientamento errato.

La soluzione

Fortunatamente, la soluzione a questo problema è piuttosto semplice: è sufficiente dotarsi di un piccola funzione che vada a controllare il tag Exif utilizzato per registrare l'orientamento del dispositivo al momento di scattare la foto e correggere quest'ultima di conseguenza. Il codice necessario si riassume nella seguente helper class da aggiungere al nostro progetto:

Il metodo include due diversi overload: il primo è una scorciatoia che consente di lavorare direttamente con i path, il secondo dà per scontato che abbiamo già acquisito l'immagine in un oggetto di tipo System.Drawing.Image.

Potete notare come,  nel caso in cui si renda necessario intervenire sull'orientamento dell'immagine, il metodo che abbiamo proposto dia anche la possibilità di rimuovere il valore del tag Exif relativo all'orientamento: è infatti del tutto evidente come, ruotando l'immagine in conseguenza di tale informazione, quest'ultima diventi inutile e possa quindi essere eliminata.

Per il momento è tutto: felice orientamento!

 

 

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane. Microsoft MVP for Development Technologies dal 2018.

View all posts by Ryan

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


Il periodo di verifica reCAPTCHA è scaduto. Ricaricare la pagina.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.