سؤال

لدي سؤال حول IPTC البيانات الوصفية.هل من الممكن البحث عن الصور التي ليست في قاعدة البيانات من قبل IPTC الوصفية (كلمات) وتبين لهم و كيف لي أن أفعل هذا ؟ أنا فقط بحاجة إلى فكرة أساسية.

أنا أعرف أن هناك iptcparse() وظيفة PHP.

كنت قد كتبت بالفعل وظيفة للاستيلاء على الصورة اسم موقع و امتداد جميع الصور داخل معرض المجلد وكافة الدلائل الفرعية من قبل .jpg التمديد.

كنت بحاجة إلى معرفة كيفية استخراج البيانات الوصفية دون تخزينه في قاعدة البيانات و كيفية البحث من خلال ذلك ، والاستيلاء على الصور ذات الصلة التي تطابق البحث الوسم (بهم IPTC الكلمات الرئيسية يجب أن يطابق) وكيفية عرضها.أنا أعرف في النقطة التي لدي النتائج النهائية (بعد البحث) يمكنني صدى أحد imagetag مع src="$filelocation"> إذا كان لديك النتائج النهائية في صفيف.

في الأساس, أنا لست متأكدا مما إذا كنت بحاجة لتخزين جميع الصور في قاعدة بيانات mysql و أيضا استخراج الكلمات وتخزينها في قاعدة البيانات وكذلك قبل أن الواقع البحث وعرض النتائج.أيضا, إذا كنت يمكن أن توجه لي أي الصور التي هي بالفعل قادرة على القيام بذلك ، يمكن أن يساعد أيضا.

شكرا على أي مساعدة فيما يتعلق بهذه المسألة.

هل كانت مفيدة؟

المحلول

وليس واضحا ما على وجه الخصوص يعطي لك المشاكل، ولكن ربما هذا سوف أعطيكم بعض الأفكار:

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

نصائح أخرى

إذا لم يكن لديك استخراج تلك IPTC البيانات من الصور الخاصة بك في كل مرة شخص ما سوف البحث ، يجب عليك أن :

  • حلقة على كل الصور
  • لكل صورة ، استخراج البيانات IPTC
  • انظر إذا كان IPTC بيانات الصورة الحالية المباريات

إذا كان لديك أكثر من بضع صورة هذا سوف يكون سيئا حقا العروض ، أود أن أقول.


لذلك في رأيي سيكون أفضل بكثير :

  • إضافة إلى اثنين من الحقول في قاعدة البيانات الخاصة بك
  • استخراج ذات الصلة IPTC البيانات عندما يتم تحميل الصورة / تخزين
  • تخزين IPTC البيانات في تلك المجالات DB
  • البحث في هذه المجالات DB
    • أو استخدام بعض محركات البحث مثل لوسين أو أبو الهول -- ولكن هذا هو مشكلة أخرى.

هذا يعني العمل أكثر قليلا بالنسبة لك الآن :لديك المزيد من التعليمات البرمجية في الكتابة...

...ولكن هذا يعني أيضا موقع الويب الخاص بك سوف يكون أفضل فرص البقاء على قيد الحياة عندما يكون هناك العديد من الصور و العديد من المستخدمين القيام بعمليات البحث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top