Pergunta

Eu tenho uma pergunta sobre metadados IPTC. É possível procurar imagens que não estão em um banco de dados por seus metadados IPTC (palavras-chave) e mostrar-lhes e como eu iria fazer isso? Eu só preciso de uma idéia básica.

Eu sei que há a função iptcparse () para PHP.

Eu já escrevi uma função para pegar o nome da imagem, localização e extensão para todas as imagens dentro de galerias de pasta e todas as subpastas por extensão .jpg.

Eu preciso descobrir como extrair os metadados sem armazená-lo em um banco de dados e como procurar por ela, agarrar as imagens relevantes que correspondem a tag de pesquisa (as suas palavras-chave IPTC deve corresponder) e como exibi-los. Sei que no ponto que eu tenho os resultados finais (busca post) i pode ecoar um imagetag com src = "$ filelocation"> se eu tiver os resultados finais em uma matriz.

Basicamente, eu não tenho certeza se eu preciso para armazenar todas as minhas imagens em um banco de dados mysql e também extrair as palavras-chave e armazená-los no banco de dados, bem antes que eu possa realmente pesquisar e exibir os resultados. Além disso, se você poderia me guiar a qualquer galeria que já é capaz de fazer isso, que poderia ajudar também.

Obrigado por qualquer ajuda sobre este assunto.

Foi útil?

Solução

Não está claro o que em particular está lhe dando problemas, mas talvez isso vai lhe dar algumas idéias:

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

Outras dicas

Se você não ter extraído esses dados IPTC de suas imagens, cada vez que alguém irá procurar, você vai ter que:

  • laço em cada imagens
  • para cada imagem, extrair os dados IPTC
  • ver se os dados de IPTC para os jogos atuais da imagem

Se você tiver mais de uma imagem de casal, isso vai ser muito ruim para performances, eu diria.


Então, na minha opinião, seria muito melhor para:

  • adicionar um par de campos em seu banco de dados
  • extrair os dados relevantes IPTC quando a imagem é carregada / armazenados
  • armazenar os dados IPTC nesses campos DB
  • pesquisar nesses campos DB
    • ou usar algum mecanismo de pesquisa como Lucene ou Sphinx -. Mas isso é outro problema

Isso vai significar um pouco mais de trabalho para você agora: você tem mais código para escrever ...

... Mas também significa que seu site terá mais chances de sobreviver quando existem várias imagens e muitos usuários fazendo pesquisas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top