Symfoware

Symfowareについての考察blog

PHP tmpfileで作成した一時ファイルに画像データを出力し、exif情報を取得する

例えば、データベースのBLOBフィールドに画像データ(jpg)が入っているとします。
データベースから取得した画像のバイナリデータのexif情報が読みたい。


ImageMagickを使う



最初に考えたのが、Imagickを使用する用法。

Imagick::readImageBlob($image)で、ImageMagickオブジェクトを生成。
http://php.net/manual/ja/imagick.readimageblob.php

生成したオブジェクトに対して、getImagePropertiesを実行。
http://php.net/manual/ja/imagick.getimageproperties.php

これでexifの情報が読み取れたのですが、オブジェクトの生成にちょっと時間がかかります。





exif_read_data



exif_read_dataを使うとImageMagickを使うより高速なのですが、
対象がファイルとして存在していないといけない。

tmpfile関数を使用して、テンポラリファイルを作成。
ファイルに内容を出力した後、exif_read_dataを実行します。

tmpfileで再生したファイルパスは、stream_get_meta_data($fp)の結果のuriに含まれています。

サンプルはこんな感じになりました。


  1. <?php
  2. // 本当はデータベースから取得したバイナリ
  3. $image = file_get_contents('image.jpg');
  4. // テンポラリファイルを作成し、内容を書き込む
  5. $fp = tmpfile();
  6. fwrite($fp, $image);
  7. fflush($fp);
  8. // ファイルポインタから、ファイルが作成されたパスをたどる
  9. $fmeta = stream_get_meta_data($fp);
  10. // ここにファイルパスが入っている
  11. $uri = $fmeta['uri'];
  12. echo $uri . PHP_EOL;
  13. // 作成したテンポラリファイルに対し、exif_read_dataを実行
  14. $exif = exif_read_data($uri);
  15. echo $exif['DateTime'] . PHP_EOL;
  16. // ファイルクローズ。
  17. // 呼び出しと同時に、ファイルは自動的に削除される
  18. fclose($fp);




実行してみると、作成されたテンポラリファイルのパスと、
欲しかったexifにある日付が取得出来ました。


$ php sample.php
/tmp/phpqo5jzH
2012:11:18 14:12:27




引数にファイルパスを要求する関数には、この方法が便利です。


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/10/24(土) 22:21:36|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<PHP 文字列の最初の1文字が特定の文字であるか判定する(startsWith) | ホーム | BeansTalkdのジョブにファイルを分割して投入&復元する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1811-624fe3da
この記事にトラックバックする(FC2ブログユーザー)