Perché le mie immagini del telefono cellulare sono ruotate sul mio desktop?

Un giorno, il mio amico mi ha inviato alcune immagini per testare il mio algoritmo. L'algoritmo ha funzionato bene e ho avuto tutto in esecuzione. Analizzando i risultati, tuttavia, ho visto che alcune immagini erano state ruotate! 

Non riuscivo davvero a capirne il motivo. Niente nel mio algoritmo ha eseguito alcuna rotazione, ed è stato un po 'strano. Fortunatamente ho scoperto il motivo per cui questo è successo dopo tutto, e in questo post ti guiderò attraverso i passaggi che puoi eseguire per analizzare le immagini che vengono ruotate stranamente usando Python.

Iniziamo!

Dati EXIF

Hai mai pensato a cosa succede quando scatti un'immagine usando la fotocamera del tuo cellulare? In questo caso, la fotocamera scriverà l'immagine in un file immagine, mentre allo stesso tempo includerà altre informazioni nell'immagine chiamata metadati; in breve, si tratta di dati sui dati. Ad esempio, la nostra immagine è considerata dati. I metadati potrebbero essere il momento in cui è stata scattata l'immagine.

I metadati vengono scritti nel file immagine utilizzando il formato file immagine intercambiabile (Exif). Nell'immagine saranno inclusi molti tag di metadati interessanti, come ad esempio rendere e modello del telefono utilizzato per scattare la foto, oltre a tag più interessanti! Pertanto, i metadati potrebbero includere informazioni preziose sulla tua immagine. 

Se si desidera approfondire i dati Exif, l'associazione CIPA (Camera and Imaging Products Association) e JEITA (Information Technology Industries Association) hanno formulato congiuntamente lo standard: CIPA DC- 008-Translation Formato file di immagine intercambiabile per fotocamere digitali: versione Exif 2.3.

Lettura dei metadati

Ora che sappiamo cosa intendiamo per metadati, andiamo avanti e leggiamo alcuni tag di metadati nella nostra immagine. Ai fini di questo tutorial, sto usando l'immagine qui sotto, che è stata scattata usando una fotocamera del cellulare. L'immagine originale può essere scaricata da toy.jpg.

Come accennato in precedenza, tag di metadati diversi verranno inclusi nell'immagine. Scriviamo uno script Python che estrae le informazioni di alcuni tag di metadati dall'immagine sopra. Per quanto riguarda l'informazione, diciamo che vogliamo saperne di più sul rendere e modello del telefono cellulare con cui è stata scattata la foto e il veloce stato al momento di scattare la foto. Per questo, useremo il modulo ExifTags, che fa parte della Python Imaging Library (PIL).

Elencherò prima lo script Python e poi passerò attraverso il codice passo dopo passo:

da importazione PIL Immagine da PIL.ExifTags import TAGS image = Image.open ('toy.jpg') info = image._getexif () per tag, valore in info.items (): chiave = TAGS.get (tag) se chiave == 'Crea': print (key + ':' + str (value)) elif key == 'Model': print (key + ':' + str (value)) elif key == 'Flash': print ( tasto + ':' + str (valore))

La prima cosa che abbiamo fatto è importare il Immagine e TAGS classi. Il Immagine la classe è usata per rappresentare un'immagine PIL, mentre la TAGS la classe, come menzionato nella documentazione, mappa le enumerazioni dei tag EXIF ​​a 16 bit interi ai nomi delle stringhe descrittive.

Passiamo poi a leggere la nostra immagine, toy.jpg, e usando il ._getexif () funzione che restituisce un dizionario di tag e il loro valori. Dopodiché, prima di stampare il valore del tag (chiave), controlliamo se quella chiave esiste nell'immagine come tag in tutto o non. 

Se desideri avere una lista dei tag disponibili nell'immagine, puoi semplicemente aggiungere la dichiarazione tasto di stampa sotto la variabile chiave nel ciclo for. Quali altri tag potresti vedere dopo aver eseguito questa dichiarazione?

Controllando l'output dello script precedente, questo è ciò che otterresti se lo avessi usato toy.jpg:

Flash: 0 Marca: samsung Modello: SAMSUNG-SM-N920A

Dall'output, sappiamo che il telefono utilizzato per scattare la foto che abbiamo visto era di tipo Samsung e modello SAMSUNG-SM-N920A. Che dire del valore 0 per il tag Veloce? Se facciamo riferimento al documento standard collegato nella sezione Dati Exif sopra, vedremo il valore 0 significa che il il flash non ha sparato al momento di scattare la foto.

Perché l'immagine è ruotata sul mio desktop?

Veniamo al nostro argomento principale: il motivo per cui a volte potresti trovare l'immagine che hai trasferito da una fotocamera del cellulare ruotata o con l'orientamento sbagliato. Possiamo scoprire il motivo di questo problema analizzando i dati Exif dell'immagine.

Un tag di metadati che possiamo usare per questo scopo è Orientamento, che, in base al documento standard collegato sopra, mostra il orientamento dell'immagine visualizzato in termini di righe e colonne. Per verificare il valore del tag di orientamento per la nostra immagine, possiamo aggiungere le seguenti dichiarazioni alla fine dello script sopra:

chiave elif == 'Orientamento': stampa (tasto + ':' + str (valore))

Le dichiarazioni di cui sopra sarebbero tornate Orientamento: 1. Riferendosi al documento degli standard Exif, il valore 1 si intende:

La riga 0 è nella parte superiore dell'immagine, e la colonna 0 è il lato visivo sinistro.

Per renderlo più chiaro, come descritto in Exif Orientation Tag, la descrizione sopra può essere letta come segue: La 0a riga nell'immagine memorizzata è la parte superiore della scena catturata e la 0a colonna nell'immagine memorizzata è il lato sinistro della scena catturata. In altre parole, l'immagine non è stata ruotata in sostanza, quindi non avremmo alcun problema di orientamento durante il trasferimento dell'immagine dal nostro telefono cellulare al desktop. Il documento Rotazione JPEG e Orientamento EXIF ​​fornisce una buona spiegazione del tag di orientamento Exif e dei suoi diversi valori.

Quindi, quando noti che un'immagine trasferita dal tuo cellulare ha una rotazione inaspettata o ha l'orientamento sbagliato, devi solo tornare al tag Orientamento Exif e controllare il suo valore per una particolare immagine, in base alla quale potresti correggi l'orientamento dell'immagine trasferita o di qualsiasi altra immagine ricevuta da qualcun altro.

Ciò è particolarmente utile quando si applica un algoritmo su un gruppo di immagini recuperate da una fotocamera di un cellulare e si desidera assicurarsi che ogni immagine sia stata salvata con l'orientamento corretto.