Frage

Ich habe eine Frage zu IPTC-Metadaten. Ist es möglich, Bilder zu suchen, die nicht in einer Datenbank durch ihre IPTC-Metadaten sind (Schlüsselwörter) und ihnen zeigen, und wie würde ich mich über das tun dies? Ich brauche nur eine Grundidee.

Ich weiß, dass es die iptcparse ist () Funktion für PHP.

Ich habe bereits eine Funktion greifen die Bildnamen, Speicherort geschrieben, und die Erweiterung für alle Bilder in einem Ordner Galerien und alle Unterverzeichnisse durch Erweiterung .jpg.

Ich brauche, um herauszufinden, wie die Metadaten zu extrahieren, ohne sie in einer Datenbank gespeichert werden und wie durch sie, greifen die entsprechenden Bildern suchen, die die Such Tag entsprechen (deren IPTC Keywords sollten übereinstimmen) und wie sie angezeigt werden soll. Ich weiß, an dem Punkt, dass ich die endgültigen Ergebnisse (post-Suche) haben kann ich eine ImageTag mit src = „$ filelocation“ echo> wenn ich die endgültigen Ergebnisse in einem Array.

Im Grunde bin ich nicht sicher, ob ich alle meine Bilder in einer MySQL-Datenbank speichern müssen und auch die Schlüsselwörter extrahieren und sie in der Datenbank speichern und bevor ich tatsächlich können die Ergebnisse suchen und anzuzeigen. Auch, wenn Sie mich zu jeder Galerie führen könnten, die bereits in der Lage ist, dies zu tun, das könnte auch helfen.

Danke für jede Hilfe zu diesem Thema.

War es hilfreich?

Lösung

Es ist nicht klar, was insbesondere Probleme ist zu geben, aber vielleicht wird dies Ihnen einige Ideen:

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

Andere Tipps

Wenn Sie nicht diese IPTC-Daten aus Ihren Bildern extrahieren, wird jedes Mal, wenn jemand suchen, werden Sie haben:

  • Schleife auf alle Bilder
  • für jedes Bild, extrahieren Sie die IPTC-Daten
  • sehen, ob die IPTC-Daten für das aktuelle Bild übereinstimmt

Wenn Sie mehr als ein paar Bild haben, wird dies für Aufführungen wirklich schlecht, würde ich sagen.


Also, meiner Meinung nach, wäre es viel besser sein:

  • Fügen Sie ein paar Felder in der Datenbank
  • extrahieren Sie die relevanten Daten IPTC, wenn das Bild hochgeladen / gespeichert
  • speichern Sie die IPTC-Daten in den DB-Felder
  • Suche in den DB-Felder
    • Oder eine Suchmaschine wie Lucene oder Sphinx verwenden -. Aber das ist ein anderes Problem

Es wird ein bisschen mehr Arbeit für Sie bedeutet jetzt: Sie mehr Code schreiben müssen ...

... Aber es bedeutet auch, Ihre Website bessere Chancen hat, um zu überleben, wenn es mehr Bilder und viele Benutzer machen sucht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top