Pregunta

Tengo una pregunta sobre los metadatos de IPTC. ¿Es posible buscar imágenes que no están en una base de datos por sus metadatos IPTC (palabras clave) y mostrarlas y cómo haría para hacerlo? Solo necesito una idea básica.

Sé que existe la función iptcparse () para PHP.

Ya he escrito una función para tomar el nombre de la imagen, la ubicación y la extensión de todas las imágenes dentro de una carpeta de galerías y todos los subdirectorios por extensión .jpg.

Necesito descubrir cómo extraer los metadatos sin almacenarlos en una base de datos y cómo buscar en ellos, tomar las imágenes relevantes que coinciden con la etiqueta de búsqueda (sus palabras clave IPTC deben coincidir) y cómo mostrarlas. Sé que en este momento tengo los resultados finales (búsqueda posterior), puedo hacer eco de una etiqueta de imagen con src = " $ filelocation " > si tengo los resultados finales en una matriz.

Básicamente, no estoy seguro de si necesito almacenar todas mis imágenes en una base de datos mysql y también extraer las palabras clave y almacenarlas en la base de datos antes de que realmente pueda buscar y mostrar los resultados. Además, si pudiera guiarme a cualquier galería que ya sea capaz de hacer esto, eso también podría ayudar.

Gracias por cualquier ayuda con respecto a este problema.

¿Fue útil?

Solución

No está claro qué es lo que en particular te está dando problemas, pero quizás esto te dará algunas ideas:

<?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;
}

Otros consejos

Si no ha extraído esos datos IPTC de sus imágenes, cada vez que alguien busque, deberá:

  • bucle en cada imagen
  • para cada imagen, extraiga los datos de IPTC
  • ver si los datos de IPTC para la imagen actual coinciden

Si tiene más de un par de imágenes, diría que esto será realmente malo para las actuaciones.


Entonces, en mi opinión, sería mucho mejor:

  • agregue un par de campos en su base de datos
  • extraer los datos relevantes de IPTC cuando la imagen se carga / almacena
  • almacenar los datos de IPTC en esos campos de base de datos
  • buscar en esos campos DB
    • O use algún motor de búsqueda como Lucene o Sphinx, pero ese es otro problema.

Significará un poco más de trabajo para usted ahora: tiene más código para escribir ...

... Pero también significa que su sitio web tendrá mejores oportunidades de sobrevivir cuando haya varias imágenes y muchos usuarios haciendo búsquedas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top