7
votes

Lire les données IPTC d'image

J'ai des problèmes avec la lecture des données IPTC de certaines images, la raison pour laquelle je veux faire cela, c'est parce que mon client a déjà tous les mots-clés déjà dans les données IPTC et ne veut pas rentrer à nouveau Les sur le site.

J'ai donc créé ce script simple pour les lire: P>

$size = getimagesize($image, $info);

if(isset($info['APP13'])) {
    $iptc = iptcparse($info['APP13']);

    print '<pre>';
        var_dump($iptc['2#025']);
    print '</pre>';
}


1 commentaires

J'ai remarqué que cela n'arrive qu'aux images enregistrées dans Photoshop CS3


3 Réponses :


0
votes

exifolool est très robuste si vous pouvez vous débarrasser de cela (de PHP On dirait?)


1 commentaires

Merci, mais malheureusement, je ne peux pas exécuter des commandes shell sur l'hébergement actuel.



0
votes

J'ai vu beaucoup de problèmes d'IPTC étranges. Pourrait être que vous avez 2 segments App13. J'ai remarqué que, pour certaines raisons, certains JPEG ont plusieurs blocs IPTC. C'est peut-être le problème avec plusieurs programmes de montage photo ou une manipulation manuelle de fichier.

pourrait être que PHP essaie de lire l'application vide et même la "métadonnata" de la vignette "intégrée.

pourrait également être un problème avec Segments Lenght - APP13 ou 8Bim ont des octets de marqueur de longue durée qui pourraient avoir des valeurs erronées.

Essayez l'éditeur hexagonal et vérifiez le fichier "manuellement".


0 commentaires

1
votes

J'ai trouvé que IPTC est presque toujours intégré sous forme de XML à l'aide du format XMP et n'est souvent pas dans la fente App13. Vous pouvez parfois obtenir les informations IPTC en utilisant iptcparrse ($ info ['app1']) code>, mais le moyen le plus fiable de l'obtenir sans une bibliothèque tierce est simplement de rechercher simplement dans le fichier image de la String XML pertinent (j'ai eu ceci d'une autre réponse, mais je n'ai pas été capable de le trouver, sinon je voudrais lier!):

Le XML pour les mots-clés a toujours le formulaire " ... Mot-clé 1 RDF: Li> Mot-clé 2 RDF: Li> ... Mot-clé N RDF: Li> RDF: SEQ> ... DC: Sujet> " Code> P>

Vous pouvez simplement obtenir le fichier en tant que chaîne à l'aide de File_Get_Contents (get_attached_file ($ pièce jointe_id)) / Code>, utilisez Strows () code> pour trouver chaque ouverture ( code>) et fermeture ( rdf: li> code>) Étiquette XML et saisissez le mot-clé entre eux à l'aide de substr () code>. P>

Le snippet suivant fonctionne pour tous les JPEG que j'ai testé. Il remplira le tableau $ Keys code> avec des balises IPTC extraites à partir d'une image sur WordPress avec ID $ pièce jointe_id code>: p>

$content = file_get_contents(get_attached_file($attachment_id));

// Look for xmp data: xml tag "dc:subject" is where keywords are stored
$xmp_data_start = strpos($content, '<dc:subject>') + 12;

// Only proceed if able to find dc:subject tag
if ($xmp_data_start != FALSE) {
    $xmp_data_end   = strpos($content, '</dc:subject>');
    $xmp_data_length     = $xmp_data_end - $xmp_data_start;
    $xmp_data       = substr($content, $xmp_data_start, $xmp_data_length);

    // Look for tag "rdf:Seq" where individual keywords are listed
    $key_data_start = strpos($xmp_data, '<rdf:Seq>') + 9;

    // Only proceed if able to find rdf:Seq tag
    if ($key_data_start != FALSE) {
        $key_data_end   = strpos($xmp_data, '</rdf:Seq>');
        $key_data_length     = $key_data_end - $key_data_start;
        $key_data       = substr($xmp_data, $key_data_start, $key_data_length);

        // $ctr will track position of each <rdf:li> tag, starting with first
        $ctr = strpos($key_data, '<rdf:li>');

        // Initialize empty array to store keywords
        $keys = Array();

        // While loop stores each keyword and searches for next xml keyword tag
        while($ctr != FALSE && $ctr < $key_data_length) {
            // Skip past the tag to get the keyword itself
            $key_begin = $ctr + 8;

            // Keyword ends where closing tag begins
            $key_end = strpos($key_data, '</rdf:li>', $key_begin);

            // Make sure keyword has a closing tag
            if ($key_end == FALSE) break;

            // Make sure keyword is not too long (not sure what WP can handle)
            $key_length = $key_end - $key_begin;
            $key_length = (100 < $key_length ? 100 : $key_length);

            // Add keyword to keyword array
            array_push($keys, substr($key_data, $key_begin, $key_length));

            // Find next keyword open tag
            $ctr = strpos($key_data, '<rdf:li>', $key_end);
        }
    }
} 


0 commentaires