Domanda

Saluti,

Riceverò informazioni exif da alcune immagini usando Android. So che ci sono alcune librerie java standard là fuori che potrei usare con il dispositivo. Sono sicuro che finirò per usarne uno.

Ma nel frattempo qualcuno può spiegarmi come queste informazioni sono codificate all'interno di un JPG? Dove / come otterresti normalmente le informazioni dal documento. Quando ho deciso di documentarlo con un editor di testo è tutto binario.

Curioso di come funziona e come potrei potenzialmente leggere i dati in questione.

È stato utile?

Soluzione

Se cerchi la stringa " Exif " troverai l'inizio dei dati Exif - è piuttosto complicato, e consiglierei di usare una libreria - (ad es. la mia società DotImage se si utilizza .NET).

Ecco una descrizione di alto livello:

L'Exif stesso si trova all'interno di un AppMarker: i tre byte precedenti saranno E1 (AppMarker 1) e la dimensione dei dati del marker nell'endianness del file. Due byte dopo l'Exif vedrai il marker di endianness (es. 49 49 significa II che significa Intel, little endian - ciò significa che i numeri di 2 byte hanno prima il byte basso nel file).

Il resto dei dati utilizza ampiamente gli offset, l'offset proviene dalla posizione del primo byte endian (i 49 nel caso precedente)

8 byte da questo offset è un numero di 2 byte che è il numero di tag exif. Se sei nell'ordine di byte II , inverti i byte per leggere la lunghezza.

Quindi ci sarà questo numero di record a 12 byte. Ognuno è:

2 bytes: Tag ID
2 bytes: Tag Type
4 bytes: Length
4 bytes: data if the data is 4 bytes or less, or an offset to the data

Dopo i record N 12 byte, i dati verranno puntati da ciascun offset utilizzato nei precedenti record N. Devi cercare ID e tipi per vedere cosa significano e come sono rappresentati.

Altri suggerimenti

Sono un po 'in ritardo alla festa, ma dopo aver scritto una libreria Java per l'elaborazione di Exif (tra gli altri tipi di metadati) ho pensato di entrare.

Exif

Exif è basato su TIFF , il formato di file immagine con tag. Quindi dobbiamo prima esaminare il TIFF:

  • Un documento TIFF contiene più directory note come IFD (directory dei file di immagine)
  • Ogni IFD contiene zero o più tag
  • Gli IFD possono collegarsi a zero o più altri IFD
  • Ogni tag ha un ID numerico e contiene zero o più valori di un tipo di dati specificato

Pensa alla struttura come a un albero con valori primitivi alle foglie. TIFF si descrive da sé sulla sua struttura, ma non impone nulla su ciò che i valori alle foglie significano effettivamente .

Davvero puoi archiviare qualsiasi tipo di dato in TIFF, non è accoppiato ad immagini.

Il file TIFF ha un'intestazione generica:

  • 2 byte per l'ordinamento dei byte, MM o II in ASCII. Questo ti dice in quale ordine prendere in considerazione tutti i byte futuri in - LSB o MSB prima.
  • 2 byte marker TIFF, per Exif questo è 0x002A
  • 4 byte puntatore al primo IFD

Gli IFD hanno una struttura altrettanto semplice:

  • 2 byte per il numero di tag da seguire
  • N byte per i tag stessi (dove N = 12 * tagCount)
  • 4 byte per puntatore opzionale all'IFD successivo (utilizzare il valore zero se non è collegato alcun IFD)

I tag hanno una rappresentazione semplice in 12 byte:

  • 2 byte per l'ID tag
  • 2 byte per il tipo di dati (int8u, int16s, float, ecc.)
  • 4 byte per il numero di valori di dati del tipo specificato
  • 4 byte per il valore stesso, se adatto, altrimenti per un puntatore a un'altra posizione in cui si possono trovare i dati - questo potrebbe essere un puntatore all'inizio di un altro IFD

I tipi di dati sono predefiniti. Ad esempio: 1 rappresenta numeri interi senza segno a 8 bit e 12 rappresenta numeri in virgola mobile a 64 bit.

Quindi, con tutto ciò che puoi, vai avanti e segui il file di dati. Alcune osservazioni:

  • Non puoi leggere i dati in ordine, in quanto è libero di collegarsi ovunque. Devi avere un accesso casuale, oppure sintetizzarlo bufferando.
  • Tutto ciò che sai a questo punto è che un tag con ID 0x1234 ha 4 numeri interi: {1,2,3,4}

Per decodificare TIFF in Exif, è necessario applicare il dizionario che definisce ciò che rappresenta ogni IFD e ciò che rappresenta ogni ID tag all'interno di tali IFD.

JPEG

La maggior parte degli utenti della mia libreria sta elaborando file JPEG. I JPEG hanno una struttura completamente diversa, che comprende una sequenza di segmenti. Ogni segmento ha un identificatore e un blocco di byte. Exif si trova nel segmento APP1 (valore numerico 0xe1 ) di un file JPEG. Una volta che hai quello, devi saltare alcuni byte iniziali ( Exif \ 0 \ 0 ) prima di vedere il MM o II che denota il inizio dei dati Exif formattati TIFF.

Unisci tutto con un esempio

Ecco un dump binario di una delle immagini di esempio della mia libreria :

In ordine:

Avvio JPEG

  • FF D8 è il "numero magico" di JPEG.
  • FF segna l'inizio di un segmento JPEG.
  • E1 indica il tipo di segmento JPEG (questo è APP1 , dove vive Exif).
  • 18 B3 (6.323 decimali) indica la lunghezza del segmento (inclusi i byte di dimensione), quindi sappiamo che tutti i dati Exif per questo file JPG verranno inseriti nel prossimo

Wikipedia ha alcuni suggerimenti su come e dove sono archiviati esattamente i dati EXIF un file. Ovviamente, c'è sempre lo standard stesso da leggere.

Questa è una delle buone librerie per Java ed EXIF: http: //www.drewnoakes. com / code / EXIF ??/

È abbastanza noioso analizzare i dati EXIF ??ma è possibile trovare molte librerie per analizzarli. Il mio preferito per Java è,

http://www.java2s.com/Open-Source/Java-Document/Web-Server/Jigsaw/org/w3c/tools/jpeg/Exif.java.htm

http://jigsaw.w3.org/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top