2008-09-09 17 views
11

Existe-t-il un bon moyen de voir quel format est une image, sans avoir à lire le fichier entier en mémoire?Existe-t-il un moyen de déduire quel format d'image un fichier est, sans lire le fichier entier?

De toute évidence, cela varie d'un format à l'autre (je suis particulièrement intéressé par les fichiers TIFF), mais quel type de procédure serait utile pour déterminer le format de l'image sans avoir à lire le fichier entier?

BONUS: Que faire si l'image est une chaîne codée en Base64? Un moyen fiable de l'inférer avant de le décoder?

Répondre

17

La plupart des formats de fichiers d'image ont des octets uniques au début. La commande unix file examine le début du fichier pour voir le type de données qu'il contient. Voir l'article Wikipedia sur Magic numbers in files et magicdb.org.

+2

Excepté pour Targa qui a des nombres magiques à la fin, et quelques saveurs de RAW qui sont entièrement indiscernables du TIFF excepté qu'ils ne décodent pas (ou vice versa). – plinth

0

Soit file sur la ligne de commande * nix, soit de lire les octets initiaux du fichier. La plupart des fichiers ont un en-tête unique dans les premiers octets. Par exemple, l'en-tête du TIFF ressemble à ceci:

0x00000000: 4949 2a00 0800 0000
Pour plus d'informations sur le format de fichier TIFF spécifiquement si vous voulez savoir ce que ces octets représentent, rendez-vous au here.

+2

Yikes "quelque chose comme" est dangereux. Il y a deux en-têtes tiff valides: 49 49 2a 00 ou 4d 4d 00 2a. le format 49 49 utilise l'ordre des octets d'Intel (petit boutiste) à travers la majeure partie du fichier, 4d 4d utilise l'octet Motorola (big endian) ce qui signifie que les 2a et 00 sont inversés par rapport à Intel. – plinth

0

TIFFs commencera par deux ou II MM (commande Intel octet ou Motorolla).
La spécification TIFF 6 peut être téléchargée here et n'est pas trop difficile à suivre

4

Bien sûr, il y a. Comme les autres l'ont mentionné, la plupart des images commencent par une sorte de 'Magic', qui se traduira toujours par un certain type de données Base64. Voici quelques exemples d'un:

Bitmap va commencer par Qk3

A Jpeg va commencer par /9j/

Un GIF commence par R0l (C'est un zéro comme deuxième char).

Et ainsi de suite. Il n'est pas difficile de prendre les différents types d'image et de comprendre ce qu'ils encodent. Soyez prudent, car certains ont plus d'une magie, vous devez donc les prendre en compte dans votre code de traduction B64.