Question

J'ai une question sur les métadonnées IPTC. Est-il possible de rechercher des images qui ne se trouvent pas dans une base de données à l'aide de leurs métadonnées IPTC (mots-clés), de les afficher et comment procéder? J'ai juste besoin d'une idée de base.

Je sais qu'il existe la fonction iptcparse () pour PHP.

J'ai déjà écrit une fonction pour saisir le nom, l'emplacement et l'extension de l'image pour toutes les images d'un dossier de galeries et de tous les sous-répertoires avec l'extension .jpg.

Je dois trouver comment extraire les métadonnées sans les stocker dans une base de données et comment les parcourir, saisir les images pertinentes correspondant à la balise de recherche (leurs mots clés IPTC doivent correspondre) et comment les afficher. Je sais au moment où j’ai les résultats finaux (après recherche) que je peux faire écho à un imagetag avec src = " $ filelocation " > si j'ai les résultats finaux dans un tableau.

En gros, je ne suis pas sûr de devoir stocker toutes mes images dans une base de données mysql, d’extraire les mots-clés et de les stocker dans la base de données avant que je puisse réellement rechercher et afficher les résultats. En outre, si vous pouviez me guider vers n’importe quelle galerie qui est déjà capable de le faire, cela pourrait également aider.

Merci pour toute aide concernant ce problème.

Était-ce utile?

La solution

On ne sait pas vraiment ce qui vous pose problème, mais cela vous donnera peut-être quelques idées:

<?php
# Images we're searching
$images = array('/path/to/image.jpg', 'another-image.jpg');

# IPTC keywords to values (from exiv2, see below)
$query = array('Byline' => 'Some Author');

# Perform the search
$result = select_jpgs_by_iptc_fields($images, $query);

# Display the results
foreach ($result as $path) {
    echo '<img src="', htmlspecialchars($path), '">';
}

function select_jpgs_by_iptc_fields($jpgs, $query) {
    $matches = array();
    foreach ($jpgs as $path) {
        $iptc = get_jpg_iptc_metadata($path);
        foreach ($query as $name => $values) {
            if (!is_array($values))
                $values = array($values);
            if (count(array_intersect($iptc[$name], $values)) != count($values))
                continue 2;
        }
        $matches[] = $path;
    }
    return $matches;
}

function get_jpg_iptc_metadata($path) {
    $size = getimagesize($path, $info);
    if(isset($info['APP13']))
    {
        return human_readable_iptc(iptcparse($info['APP13']));
    }
    else {
        return null;
    }
}

function human_readable_iptc($iptc) {
# From the exiv2 sources
static $iptc_codes_to_names =
array(    
// IPTC.Envelope-->
"1#000" => 'ModelVersion',
"1#005" => 'Destination',
"1#020" => 'FileFormat',
"1#022" => 'FileVersion',
"1#030" => 'ServiceId',
"1#040" => 'EnvelopeNumber',
"1#050" => 'ProductId',
"1#060" => 'EnvelopePriority',
"1#070" => 'DateSent',
"1#080" => 'TimeSent',
"1#090" => 'CharacterSet',
"1#100" => 'UNO',
"1#120" => 'ARMId',
"1#122" => 'ARMVersion',
// <-- IPTC.Envelope
// IPTC.Application2 -->
"2#000" => 'RecordVersion',
"2#003" => 'ObjectType',
"2#004" => 'ObjectAttribute',
"2#005" => 'ObjectName',
"2#007" => 'EditStatus',
"2#008" => 'EditorialUpdate',
"2#010" => 'Urgency',
"2#012" => 'Subject',
"2#015" => 'Category',
"2#020" => 'SuppCategory',
"2#022" => 'FixtureId',
"2#025" => 'Keywords',
"2#026" => 'LocationCode',
"2#027" => 'LocationName',
"2#030" => 'ReleaseDate',
"2#035" => 'ReleaseTime',
"2#037" => 'ExpirationDate',
"2#038" => 'ExpirationTime',
"2#040" => 'SpecialInstructions',
"2#042" => 'ActionAdvised',
"2#045" => 'ReferenceService',
"2#047" => 'ReferenceDate',
"2#050" => 'ReferenceNumber',
"2#055" => 'DateCreated',
"2#060" => 'TimeCreated',
"2#062" => 'DigitizationDate',
"2#063" => 'DigitizationTime',
"2#065" => 'Program',
"2#070" => 'ProgramVersion',
"2#075" => 'ObjectCycle',
"2#080" => 'Byline',
"2#085" => 'BylineTitle',
"2#090" => 'City',
"2#092" => 'SubLocation',
"2#095" => 'ProvinceState',
"2#100" => 'CountryCode',
"2#101" => 'CountryName',
"2#103" => 'TransmissionReference',
"2#105" => 'Headline',
"2#110" => 'Credit',
"2#115" => 'Source',
"2#116" => 'Copyright',
"2#118" => 'Contact',
"2#120" => 'Caption',
"2#122" => 'Writer',
"2#125" => 'RasterizedCaption',
"2#130" => 'ImageType',
"2#131" => 'ImageOrientation',
"2#135" => 'Language',
"2#150" => 'AudioType',
"2#151" => 'AudioRate',
"2#152" => 'AudioResolution',
"2#153" => 'AudioDuration',
"2#154" => 'AudioOutcue',
"2#200" => 'PreviewFormat',
"2#201" => 'PreviewVersion',
"2#202" => 'Preview',
// <--IPTC.Application2
      );
   $human_readable = array();
   foreach ($iptc as $code => $field_value) {
       $human_readable[$iptc_codes_to_names[$code]] = $field_value;
   }
   return $human_readable;
}

Autres conseils

Si vous n'avez pas extrait ces données IPTC de vos images, chaque fois que quelqu'un effectuera une recherche, vous devrez:

  • boucle sur chaque image
  • pour chaque image, extrayez les données IPTC
  • voir si les données IPTC de l'image actuelle correspondent

Si vous avez plus d'une image de couple, ce sera vraiment mauvais pour les performances, je dirais.


Donc, à mon avis, il vaudrait beaucoup mieux:

  • ajoutez quelques champs dans votre base de données
  • extraire les données IPTC pertinentes lorsque l'image est chargée / stockée
  • stocker les données IPTC dans ces champs de base de données
  • recherche dans ces champs de base de données
    • Ou utilisez un moteur de recherche comme Lucene ou Sphinx, mais c’est un autre problème.

Cela signifiera un peu plus de travail pour vous maintenant: vous avez plus de code à écrire ...

... Mais cela signifie également que votre site Web aura de meilleures chances de survivre s'il existe plusieurs images et que de nombreux utilisateurs effectuent des recherches.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top