1. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

Запись Exif/iptc метаданных [бойз, ай нид хелп]

Тема в разделе "Web - программирование", создана пользователем ioni, 21 авг 2009.

  1. ioni

    ioni Well-Known Member

    Репутация:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    340
    Симпатии:
    0
    Не могу понять, где затык - с другой стороны, я в php разбираюсь на уровне хелоу ворлд.

    Итак, задача: для всех файлов каталога надо прописать метаданные EXIF/IPTC средствами php.
    То есть казалось бы, ничего сложного:
    (1) открыть файл
    (2) получить существующие метаданные
    (3) закодировать новые данные
    (4) сохранить файл

    и так - для каждого файла в каталоге.
    Единственный потенциальный затык - UTF-8 (кодировать надо бинарно), но представим, что метаданные надо прописывать на английском (хотя на самом деле - на русском). Правда, просто?

    Вот я и так думал.

    Короче мое решение (которое не дает результата)
    Код:
    <?php
    
    $caption	='This is Caption and it is different from Title';
    
    $path='img/';
    
    if ($handle = opendir($path)) { 
    while (false !== ($file = readdir($handle))) { 
    if ($file != "." && $file != "..") { 
    
    // prepare ITPC
    $i = new iptc($path.$file);
    echo $i->set('IPTC_CAPTION',$caption); 
    $i->write();		
    
    } 
    } 
    closedir($handle); 
    } 
    
    // IPTC easy calss from php.net
    
    /************************************************************\
    
    IPTC EASY 1.0 - IPTC data manipulator for JPEG images
    
    All reserved www.image-host-script.com
    
    Sep 15, 2008
    
    \************************************************************/
    
    DEFINE('IPTC_OBJECT_NAME', '005');
    DEFINE('IPTC_EDIT_STATUS', '007');
    DEFINE('IPTC_PRIORITY', '010');
    DEFINE('IPTC_CATEGORY', '015');
    DEFINE('IPTC_SUPPLEMENTAL_CATEGORY', '020');
    DEFINE('IPTC_FIXTURE_IDENTIFIER', '022');
    DEFINE('IPTC_KEYWORDS', '025');
    DEFINE('IPTC_RELEASE_DATE', '030');
    DEFINE('IPTC_RELEASE_TIME', '035');
    DEFINE('IPTC_SPECIAL_INSTRUCTIONS', '040');
    DEFINE('IPTC_REFERENCE_SERVICE', '045');
    DEFINE('IPTC_REFERENCE_DATE', '047');
    DEFINE('IPTC_REFERENCE_NUMBER', '050');
    DEFINE('IPTC_CREATED_DATE', '055');
    DEFINE('IPTC_CREATED_TIME', '060');
    DEFINE('IPTC_ORIGINATING_PROGRAM', '065');
    DEFINE('IPTC_PROGRAM_VERSION', '070');
    DEFINE('IPTC_OBJECT_CYCLE', '075');
    DEFINE('IPTC_BYLINE', '080');
    DEFINE('IPTC_BYLINE_TITLE', '085');
    DEFINE('IPTC_CITY', '090');
    DEFINE('IPTC_PROVINCE_STATE', '095');
    DEFINE('IPTC_COUNTRY_CODE', '100');
    DEFINE('IPTC_COUNTRY', '101');
    DEFINE('IPTC_ORIGINAL_TRANSMISSION_REFERENCE',	 '103');
    DEFINE('IPTC_HEADLINE', '105');
    DEFINE('IPTC_CREDIT', '110');
    DEFINE('IPTC_SOURCE', '115');
    DEFINE('IPTC_COPYRIGHT_STRING', '116');
    DEFINE('IPTC_CAPTION', '120');
    DEFINE('IPTC_LOCAL_CAPTION', '121');
    
    class iptc {
    var $meta=Array();
    var $hasmeta=false;
    var $file=false;
    
    
    function iptc($filename) {
    $size = getimagesize($filename,$info);
    $this->hasmeta = isset($info["APP13"]);
    if($this->hasmeta)
    $this->meta = iptcparse ($info["APP13"]);
    $this->file = $filename;
    }
    function set($tag, $data) {
    $this->meta ["2#$tag"]= Array( $data );
    $this->hasmeta=true;
    }
    function get($tag) {
    return isset($this->meta["2#$tag"]) ? $this->meta["2#$tag"][0] : false;
    }
    
    function dump() {
    print_r($this->meta);
    }
    function binary() {
    $iptc_new = '';
    foreach (array_keys($this->meta) as $s) {
    $tag = str_replace("2#", "", $s);
    $iptc_new .= $this->iptc_maketag(2, $tag, $this->meta[$s][0]);
    }		
    return $iptc_new;	
    }
    function iptc_maketag($rec,$dat,$val) {
    $len = strlen($val);
    if ($len < 0x8000) {
    return chr(0x1c).chr($rec).chr($dat).
    chr($len >> 8).
    chr($len & 0xff).
    $val;
    } else {
    return chr(0x1c).chr($rec).chr($dat).
    chr(0x80).chr(0x04).
    chr(($len >> 24) & 0xff).
    chr(($len >> 16) & 0xff).
    chr(($len >> 8 ) & 0xff).
    chr(($len ) & 0xff).
    $val;
    
    }
    }	
    function write() {
    if(!function_exists('iptcembed')) return false;
    $mode = 0;
    $content = iptcembed($this->binary(), $this->file, $mode);	
    $filename = $this->file;
    
    @unlink($filename); #delete if exists
    
    $fp = fopen($filename, "w");
    fwrite($fp, $content);
    fclose($fp);
    }	
    
    //requires GD library installed
    // установлен, работает, каталог открыт для записи и рисунки в нем есть, btw
    function removeAllTags() {
    $this->hasmeta=false;
    $this->meta=Array();
    $img = imagecreatefromstring(implode(file($this->file)));
    @unlink($this->file); #delete if exists
    imagejpeg($img,$this->file,100);
    }
    };
    
    
    ?>

    Есть идеи?
     
Загрузка...

Поделиться этой страницей