2008-09-09 12 views
11

¿Hay alguna manera de ver qué formato tiene una imagen sin tener que leer todo el archivo en la memoria?¿Hay alguna forma de inferir qué formato de imagen es un archivo sin leer todo el archivo?

Obviamente esto variaría de formato a formato (estoy particularmente interesado en archivos TIFF) pero ¿qué tipo de procedimiento sería útil para determinar qué tipo de formato de imagen es un archivo sin tener que leer todo el archivo?

BONUS: ¿Qué sucede si la imagen es una cadena codificada en Base64? ¿Alguna forma confiable de inferirlo antes de decodificarlo?

Respuesta

17

La mayoría de los formatos de archivos de imagen tienen bytes únicos al comienzo. El comando unix file mira el inicio del archivo para ver qué tipo de datos contiene. Ver el artículo de Wikipedia en Magic numbers in files y magicdb.org.

+2

Excepto Targa que tiene números mágicos al final, y algunos sabores de RAW que son completamente indistinguibles de TIFF excepto que no se decodifican (o viceversa). – plinth

0

O bien file en la línea de comandos * nix o leyendo los bytes iniciales del archivo. La mayoría de los archivos vienen con un encabezado único en los primeros bytes. Por ejemplo, el encabezado de TIFF se parece a esto:

0x00000000: 4949 2a00 0800 0000
Para obtener más información sobre el formato de archivo TIFF específicamente si desea saber qué representan esos bytes, vaya al here.

+2

Yikes "algo así como" es peligroso. Hay dos encabezados tiff válidos: 49 49 2a 00 o 4d 4d 00 2a. el formato 49 49 utiliza el orden de bytes de Intel (little endian) en la mayor parte del archivo, 4d 4d utiliza el byte de Motorola (big endian), lo que significa que el 2a y el 00 están invertidos de Intel. – plinth

0

TIFF se iniciará con cualquiera II o MM (orden de bytes de Intel o Motorolla).
La especificación TIFF 6 se puede descargar here y no es demasiado difícil de seguir

4

Sure there is. Como han mencionado los otros, la mayoría de las imágenes comienzan con algún tipo de "magia", que siempre se traducirá en algún tipo de datos de Base64. Los siguientes son un par de ejemplos:

un mapa de bits se iniciará con Qk3

un archivo JPEG se iniciará con /9j/

Un GIF se iniciará con R0l (Eso es un cero como el segundo char).

Y así sucesivamente. No es difícil tomar los diferentes tipos de imágenes y descubrir a qué codifican. Solo tenga cuidado, ya que algunos tienen más de una pieza de magia, por lo que debe contarlos en su "código de traducción" B64.

Cuestiones relacionadas