2009-09-24 9 views
2

Existe-t-il un moyen peu coûteux et fiable de détecter si un fichier image contient des données EXIF? Quelque chose comme "lire les 100 premiers octets et rechercher EXIF ​​ sous-chaîne" est hautement préférable. Je n'ai pas besoin de lire et d'analyser - seulement pour savoir si c'est là.Existe-t-il un moyen simple de détecter si un fichier contient des données EXIF?

La clé est que cela doit être très rapide. C++ est préférable.

+1

est spécifique à cette langue une? PHP a construit dans les fonctions EXIF ​​ –

Répondre

0

Vous pouvez lire le source of the PHP EXIF extension - en regardant comment la spécification exif_read_data est implémentée, vous pourriez trouver quelques indices.

1

Vous pouvez regarder l'implémentation de file (1).

Vous pouvez appeler juste, bien sûr, mais vous n'avez pas besoin sans doute le reste de la fonctionnalité de file si ...

0

Si vous ne souhaitez pas la performance énorme, j'utiliser une bibliothèque Exif et laissez-le essayer d'obtenir les données Exif (si elles sont présentes) pour vous. (Pyexif, perl image :: exif, C# MetaDataExtractor etc)

Sinon,

jeter un oeil à http://en.wikipedia.org/wiki/JPEG#Syntax_and_structure

Vous devez créer un analyseur binaire simple ne pas creuser les "codes de segments", et pour trouver le segment appelé APP1 (si je le comprends correctement). Les données doivent contenir les lettres "Exif"

par exemple. dans un fichier JPEG aléatoire sur mon PC, les octets 7-10 disaient "Exif". Je ne sais pas si l'emplacement est le même dans tous les fichiers JPEG. Les segments peuvent être de longueur variable.

1

Il vous suffit de vérifier 4 premiers octets du flux:

bool IsExifStream(const char* pJpegBuffer) 
{ 
    static const char stream_prefix1[] = "\xff\xd8\xff\xe1"; 
    return memcmp(pJpegBuffer, stream_prefix1, 4) == 0; 
} 
+0

Le problème est que je ne veux pas analyser le fichier pour trouver où le flux commence. Je ne me soucie pas du flux, je travaille avec un fichier. – sharptooth