2012-01-14 22 views
4

私はPHP用のギャラリー実装を行っています。ファイルのメタデータを読む

管理者は、アップロードページにアクセスして、アップロードして画像を分類することができます。ここまでは順調ですね。

この実装では、管理者がアップロードした画像にコメントすることができるので、コメントをそれぞれの画像にリンクするデータベーステーブルを実装しています。

これまでのところとても良いです。

管理者にファイル名の変更(サイト経由ではなく、FTPまたはルートアクセスによる)を行い、システム全体を破壊しないようにします。

私は、IDと画像をリンクするメタデータシステムを実装することを考えていました。それは私の最初のテーブルの両方を節約し、画像の自由な操作(フォルダ内での移動、名前の変更など)を可能にします。

質問はどうやって実装するのですか?ファイルに添付されたメタデータを作成するにはどうすればよいですか? Googleはこれについて実際の結果を出さなかった。

もっと良い方法があれば、私も聞いてみたいです!

助けていただきありがとうございます。

答えて

5

sourceforgeのXMP PHP Toolkitはあなたが探しているもののように聞こえます:http://xmpphptoolkit.sourceforge.net/これはアルファ版で、1年以上も更新されていません。

XMPツールキットPHP拡張モジュールは、Adobe XMP ツールキットSDKを含むPHPモジュールです。このPHP5拡張モジュールは、 に、jpegs、tiff、pngのようなファイルからXMPメタデータを操作するためのクラスとメソッドを提供します。 wav、mp3、avi、mpeg4、pdf、ai、eps ... Adob​​e XMP Toolkit SDK 4.4に基づいています。 2。この拡張の目的は、ファイルを開き、メタデータを抽出し、操作し、 をPHPコードの数行以内に戻すことができるPHPクラス を持つことです。このプロジェクトはGPL v3の下にあります ライセンス。

また、iptcembedを使用して画像ファイルに任意のメタデータを書き込むこともできます。あなたのコメントで言及しているように、これはJPEGファイルに対してのみ機能します。ここで

http://php.net/manual/en/function.iptcembed.php

取得し、IPTCデータを設定するクラスのコメントからスクリプトです:

$i = new iptc("test.jpg"); 
echo $i->get(IPTC_COPYRIGHT_STRING); 

更新著作権表示:

<? 

    /************************************************************\ 

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


?> 

例は、著作権文字列を読みます

$i = new iptc("test.jpg"); 
echo $i->set(IPTC_COPYRIGHT_STRING,"Here goes the new data"); 
$i->write(); 
+0

そのように見えますが、古いだけです。いずれにしても、例では 'jpg'ファイルのみが表示されていますが、ギャラリーであるため画像タイプを増やす必要があります。' gif'はおそらく 'png'でしょう。提案はありますか? –

+0

私はXMP PHP Toolkitで見つけた情報を含めるように私のコメントを編集しました。それがサポートしているものではるかに堅牢に聞こえる。 – Rapture

+1

私はあなたの編集を見てきました(私は2回upvoteすることはできません残念)私はそれを試して戻ってきます。それが意図したとおりに動作することがわかったら、私はこの答えを受け入れるでしょう!ありがとうございます:) –