문제

IPTC 메타 데이터에 대한 질문이 있습니다. IPTC 메타 데이터 (키워드)로 데이터베이스에없는 이미지를 검색하고 표시 할 수 있으며 어떻게이를 수행 할 것인가? 기본 아이디어가 필요합니다.

PHP에 대한 iptcparse () 함수가 있다는 것을 알고 있습니다.

이미 갤러리 폴더 내의 모든 이미지에 대한 이미지 이름, 위치 및 확장자와 모든 하위 디렉토리를 .jpg 확장자로 가져 오는 기능을 작성했습니다.

데이터베이스에 저장하지 않고 메타 데이터를 추출하는 방법과 검색 방법을 검색하고 검색 태그와 일치하는 관련 이미지 (IPTC 키워드가 일치해야 함) 및 표시 방법을 찾아야합니다. 최종 결과 (사후 검색)가 있다는 시점에서 SRC = "$ filelocation"으로 ImageTag를 반영 할 수 있다는 것을 알고 있습니다. 최종 결과가 배열이있는 경우 배열이 있습니다.

기본적으로 모든 이미지를 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