2010-11-04 13 views
2

Je voudrais extraire deux champs d'un fichier PNG. A savoir, le champ de géométrie et l'un des champs des métadonnées.Le moyen le plus rapide de lire les métadonnées PNG en PHP

Quel est le moyen le plus rapide de le faire? J'ai évalué mon script qui effectue actuellement ceci et de loin l'action la plus lente exécute le programme "identifier" ImageMagick réel sur le fichier PNG. (.4 secondes contre .0001 secondes pour analyser le tableau pour la géométrie en sortie et 8.39E-5 secondes pour analyser les phrases clés à partir des métadonnées)

Merci d'avance pour toute aide,

Jonathan

+0

montrez-nous votre code pour que nous n'ayons pas à le répliquer – stillstanding

+0

Mine est un appel très simple à exec() pour 'identify -verbose {$ file_name}' (bien sûr avec échappement). Cet appel en lui-même prend .4 secondes. –

Répondre

1

Je ne connais pas de bibliothèques ou de classes prêtes à l'emploi pour le faire en PHP sans un appel de sous-processus, mais si vous ne pouvez pas en trouver un, écrire le vôtre serait définitivement la solution.

PNG est un format de flux de blocs relativement simple, donc la recherche d'un bloc spécifique et l'extraction de certains champs d'en-tête sont triviales. Tout ce dont vous avez besoin est quelque chose qui lit et vérifie l'en-tête PNG de 8 octets 89 50 4E 47 0D 0A 1A 0A puis alterne entre la lecture de 8 octets (longueur de bloc plus le type) et la recherche du bloc en utilisant la longueur jusqu'à ce que vous atteigniez le type de morceau vouloir.

Pour la géométrie, en supposant que le PNG suit les spécifications, voici comment cela irait:

  1. Lire et vérifier en-tête PNG (8 octets)
  2. Lire et vérifier en-tête du premier bloc (8 octets
    1. Succès. type = IHDR
    2. Lire 8 octets supplémentaires pour la géométrie (largeur, hauteur. 4 octets)
  3. Si le champ autre que vous vouliez est pas IHDR, utilisez la taille de bloc de l'étape 2 chercher au bloc suivant à la recherche de l'autre domaine que vous vouliez.

Il me faudrait probablement 5 à 15 minutes pour fouetter quelque chose comme ça en Python. (J'ai fait des choses similaires avec RAR et GIF) Peut-être 15 à 25 en PHP car j'ai moins d'expérience dans les E/S de bas niveau.

+0

Merci pour l'explication succint de l'en-tête PNG. Votre réponse m'a mis sur le bon chemin - merci! –