Pregunta

Saludos,

Voy a obtener información exif de algunas imágenes usando Android. Sé que hay algunos java lib estándar que podría usar con el dispositivo. Estoy seguro de que terminaré usando uno.

Pero mientras tanto, ¿alguien puede explicarme cómo se codifica esta información dentro de un JPG? Dónde / cómo normalmente obtendría la información del documento. Cuando abrí el documento con un editor de texto, todo es binario.

Curioso sobre cómo funciona y cómo podría leer los datos en cuestión.

¿Fue útil?

Solución

Si busca la cadena " Exif " encontrará el inicio de los datos Exif, es bastante complicado, y recomendaría usar una biblioteca (por ejemplo, DotImage si estaba usando .NET).

Aquí hay una descripción de alto nivel:

El Exif en sí está dentro de un AppMarker: los tres bytes anteriores serán E1 (AppMarker 1) y el tamaño de los datos del marcador en la endianness del archivo. Dos bytes después de Exif verá el marcador de endianness (por ejemplo, 49 49 significa II que significa Intel, little endian, lo que significa que los números de 2 bytes tienen primero el byte bajo en el archivo).

El resto de los datos usa compensaciones ampliamente, el desplazamiento es desde la ubicación del primer byte endian (el 49 en el caso anterior)

8 bytes de este desplazamiento es un número de 2 bytes que es el número de etiquetas exif. Si está en el orden de bytes II , invierta los bytes para leer la longitud.

Entonces habrá este número de registros de 12 bytes. Cada uno es:

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

Después de los registros de N 12 bytes, tendrá los datos señalados por cada desplazamiento utilizado en los N registros anteriores. Debe buscar identificadores y tipos para ver qué significan y cómo están representados.

Otros consejos

Llego un poco tarde a la fiesta, pero después de haber escrito una biblioteca Java para procesar Exif (entre otros tipos de metadatos) pensé en intervenir.

Exif

Exif se basa en TIFF , el formato de archivo de imagen etiquetada. Entonces, primero tenemos que examinar TIFF:

  • Un documento TIFF contiene múltiples directorios conocidos como IFD (directorios de archivos de imagen)
  • Cada IFD contiene cero o más etiquetas
  • Los IFD pueden vincularse a cero o más otros IFD
  • Cada etiqueta tiene una ID numérica y contiene cero o más valores de un tipo de datos especificado

Piense en la estructura como un árbol con valores primitivos en las hojas. TIFF se autodescribe sobre su estructura, pero no dicta nada sobre lo que los valores en las hojas realmente significan .

Realmente puede almacenar cualquier tipo de datos en TIFF, no está acoplado a imágenes.

El archivo TIFF tiene un encabezado genérico:

  • 2 bytes para ordenar bytes, ya sea MM o II en ASCII. Esto le indica en qué orden considerar todos los bytes futuros: LSB o MSB primero.
  • 2 bytes marcador TIFF, para Exif este es 0x002A
  • 4 bytes puntero al primer IFD

Los IFD tienen una estructura igualmente simple:

  • 2 bytes para la cantidad de etiquetas a seguir
  • N bytes para las etiquetas mismas (donde N = 12 * tagCount)
  • 4 bytes para puntero opcional al siguiente IFD (use valor cero si no hay ningún IFD vinculado)

Las etiquetas tienen una representación simple en 12 bytes:

  • 2 bytes para el ID de etiqueta
  • 2 bytes para el tipo de datos (int8u, int16s, float, etc.)
  • 4 bytes para el número de valores de datos del tipo especificado
  • 4 bytes para el valor en sí, si cabe, de lo contrario para un puntero a otra ubicación donde se pueden encontrar los datos, esto podría ser un puntero al comienzo de otro IFD

Los tipos de datos están predefinidos. Por ejemplo: 1 representa enteros sin signo de 8 bits y 12 representa números de coma flotante de 64 bits.

Entonces con todo lo que puede seguir y seguir el archivo de datos. Algunas observaciones:

  • No puede leer los datos en orden, ya que es libre de vincular en todo el lugar. Debe tener acceso aleatorio o sintetizarlo mediante almacenamiento en búfer.
  • Todo lo que sabe en este momento es que una etiqueta con ID 0x1234 tiene 4 enteros: {1,2,3,4}

Para decodificar TIFF en Exif, debe aplicar el diccionario que define qué representa cada IFD y qué representa cada ID de etiqueta dentro de esos IFD.

JPEG

La mayoría de los usuarios de mi biblioteca están procesando archivos JPEG. Los archivos JPEG tienen una estructura completamente diferente, que comprende una secuencia de segmentos. Cada segmento tiene un identificador y un bloque de bytes. Exif se encuentra en el segmento APP1 (valor numérico 0xe1 ) de un archivo JPEG. Una vez que tenga eso, debe omitir algunos bytes iniciales ( Exif \ 0 \ 0 ) antes de ver el MM o II que denota el inicio de los datos Exif con formato TIFF.

Reuniendo todo con un ejemplo

Aquí hay un volcado binario de una de las imágenes de muestra de mi biblioteca :

En orden:

JPEG comienza

  • FF D8 es el 'número mágico' JPEG.
  • FF marca el inicio de un segmento JPEG.
  • E1 indica el tipo de segmento JPEG (esto es APP1 , donde vive Exif).
  • 18 B3 (6,323 decimal) da la longitud del segmento (incluidos los bytes de tamaño), por lo que sabemos que todos los datos Exif para este archivo JPG se ubicarán en el próximo

Wikipedia tiene algunos consejos sobre cómo y dónde se almacenan exactamente los datos EXIF ??en un archivo. Por supuesto, siempre existe el estándar sí mismo para leer.

Esta es una de las buenas bibliotecas para Java y EXIF: http: //www.drewnoakes. com / code / exif /

Es bastante tedioso analizar datos EXIF, pero puede encontrar muchas bibliotecas para analizarlos. Mi favorito para Java es,

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

http://jigsaw.w3.org/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top