平成30/ 2018-10-24 08:56
PHP/EXIF

___ php標準のEXIFが無い場合は、PlejJpegや、PHP JPEG Metadata Toolkitを使えばいい。
yum install php-exif
でインストールできるらしいが、試したのだが、リポジトリに存在してなくて、ダメだった。



___ PlejJpegは以下サイトから取得する。解凍して、「src」ディレクトリだけ使えばいい。
http://lsolesen.github.io/pel/

PHP JPEG Metadata Toolkit
http://ozhiker.com/electronics/pjmt/library/documentation/example.html
というライブラリもあるが、EXIF情報削除するだけなら必要ない。使いやすくはある。



___ 調整必要であり、
ここの部分で
$jpeg = new PelJpeg($row["file"]);
以下のようなエラーがでる。
Fatal error: Uncaught exception 'PelDataWindowOffsetException' with message 'Offset -1 not within [0, 15109]' in /home/xxx/lib/pel/PelDataWindow.php:259
これは例外処理の宣言が無いということで、以下の対応するといい。
/home/xxx/lib/pel/PelJpeg.php
にPelDataWindowOffsetExceptionの例外を追加する。
                    try {
                        $content = new PelExif();
                        $content->load($d->getClone(0, $len));
                    } catch (PelInvalidDataException $e) {
                        /* We store the data as normal JPEG content if it could
                         * not be parsed as Exif data. */
                        $content = new PelJpegContent($d->getClone(0, $len));
                    } catch (PelDataWindowOffsetException $e) {
                        /* We store the data as normal JPEG content if it could
                         * not be parsed as Exif data. */
                        $content = new PelJpegContent($d->getClone(0, $len));
                    }
この例外はEXIF情報が無い場合に表示されるもののようで、上記の対応だけでは
        $exif = $ifd0->getSubIfd(PelIfd::EXIF);
        $data['exif_version'] = $exif->getEntry(PelTag::EXIF_VERSION)->getText(); // Exifバージョン
とするとエラーがでる。なので以下のようにオブジェクト生むを確認する必要ある。
        $exif = $ifd0->getSubIfd(PelIfd::EXIF);
        if (!$exif) continue;
        $data['exif_version'] = $exif->getEntry(PelTag::EXIF_VERSION)->getText(); // Exifバージョン


___ EXIF情報を削除する例



___ EXIF情報を取得の例
require_once $BASEDIR. "/lib/pel/PelJpeg.php";

//____ 画像の高さ、幅を取得する
function imgXYLi($ID_LI){
    $id_li = array();
    $re    = array();
    foreach($ID_LI as $id){
        $id_li[] = dbEsc($id);
        $re[$id]["x"] = "";
        $re[$id]["y"] = "";
    }
    $idcond = implode(",", $id_li);
    $sql = "select imageinfoid as id, x, y, model from img_xy where imageinfoid in({$idcond})";
    $res = mysql_query($sql);
    $idcond = array();
    $model_li = array();
    while($row = mysql_fetch_assoc($res)){
        $re[$row["id"]] = $row;
    }
    foreach($re as $id => $row){
        if(
        !empty($row["x"])
        ){
            continue;
        }
        $idcond[] = dbEsc($id);
    }


    $idcond = implode(",", $idcond);
    if(
    !empty($idcond)
    ){

        /// x, y 取得
        $sql = "select imageinfoid as id, image from image_info where imageinfoid in({$idcond})";
        $res = mysql_query($sql);
        $values = array();

        while($row = mysql_fetch_assoc($res)){
            $X = imagesx( imagecreatefromstring ($row["image"])); // 幅
            $Y = imagesy( imagecreatefromstring ($row["image"])); // 高さ
            $re[$row["id"]]["x"] = $X;
            $re[$row["id"]]["y"] = $Y;

            // DBに登録しとく
            $id = dbEsc($row["id"]);
            $x  = dbEsc($X);
            $y  = dbEsc($Y);
            $values[] = "({$id},{$x},{$y})";
        }
        $values = implode(",", $values);
        if(
        $values
        ){
            $sql = "insert into img_xy(imageinfoid,x,y)values{$values}";
            mysql_query($sql);
        }
    }


    //___ EXIF情報のモデル(撮影したカメラ)
    $idcond = implode(",", $id_li);
    $sql = "select imageinfoid as id, imageformat as format from image_info where imageinfoid in({$idcond})";
    $res = mysql_query($sql);
    while($row = mysql_fetch_assoc($res)){
        $re[$row["id"]]["format"] = $row["format"];
    }

    $no_file = array();
    foreach($re as $key => $row){
        $file = dirname($_SERVER["DOCUMENT_ROOT"]). "/tmp/img/{$row["id"]}.{$row["format"]}";
        $re[$key]["file"] = $file;
        if(
        !file_exists($file)
        ){
            $no_file[] = dbEsc($row["id"]);
        }
    }
    $no_file = implode(",", $no_file);
    if(
    $no_file
    ){
        $file = dirname($_SERVER["DOCUMENT_ROOT"]). "/tmp/img/{$row["id"]}.{$row["format"]}";
        $sql = "select imageinfoid as id, image from image_info where imageinfoid in({$no_file})";
        //echo $sql;
        $res = mysql_query($sql);
        while($row = mysql_fetch_assoc($res)){
            $file = $re[$row["id"]]["file"];
            //echo $file. "<br />";
            file_put_contents($file, $row["image"]);
            if (chmod($file, 0777)) {
            }
        }
    }
//return $re;
    foreach($re as $row){
        if(
           !empty($row["model"]) or
           (
            $row["format"] <> "jpg" and
            $row["format"] <> "jpeg"
           )
        ){
            continue;
        }
        $jpeg = new PelJpeg($row["file"]);
        $app1 = $jpeg->getExif();

        if (!$app1) continue;

        $tiff = $app1->getTiff();
        $ifd0 = $tiff->getIfd();

        if (!$ifd0) continue;

        $exif = $ifd0->getSubIfd(PelIfd::EXIF);
        if (!$exif) continue;


        //$data['exif_version'] = $exif->getEntry(PelTag::EXIF_VERSION)->getText(); // Exifバージョン
        //$data['pixel_x']      = $exif->getEntry(PelTag::PIXEL_X_DIMENSION)->getValue(); // 幅
        //$data['pixel_x']      = $exif->getEntry(PelTag::PIXEL_X_DIMENSION)->getValue(); // 幅
        //$data['pixel_y']            = $exif->getEntry(PelTag::PIXEL_Y_DIMENSION)->getValue(); // 高
        //$data['date_time_original'] = $exif->getEntry(PelTag::DATE_TIME_ORIGINAL)->getText(); // オリジナルの作成日時
        //$data['make']               = $ifd0->getEntry(PelTag::MAKE)->getText(); // メーカー

        // 画像によってはEXIF情報が無い場合もあるので取得できるかis_objectで確認する必要ある
        if(
        is_object($ifd0->getEntry(PelTag::MODEL))
        ){
            $data['model']              = $ifd0->getEntry(PelTag::MODEL)->getText(); // モデル
        }
        //$data['fnumber']            = //$exif->getEntry(PelTag::FNUMBER)->getValue(); // 絞り値
        //$data['exposure_time']      = $exif->getEntry(PelTag::EXPOSURE_TIME)->getValue(); // 露出時間
        //$data['iso_speed_ratings']  = $exif->getEntry(PelTag::ISO_SPEED_RATINGS)->getValue(); // ISO速度
        //$data['exposure_bias']      = $exif->getEntry(PelTag::EXPOSURE_BIAS_VALUE)->getValue(); // 露出補正
        //$data['focal_length']       = $exif->getEntry(PelTag::FOCAL_LENGTH)->getValue(); // 焦点距離

        if(empty($data["model"])) continue;

        $model = dbEsc($data["model"]);
        $id = dbEsc($row["id"]);
        $sql = "update img_xy set model={$model} where imageinfoid = {$id}";
        mysql_query($sql);

        $re[$row["id"]]["format"] = $data["model"];
    }

    return $re;
}


<?php
if(
count($CR["img"])
){
?>
            <h2 class="com_ttlm m_b20">写真</h2>
            <ul class="picbx clearfix">
<?php
$i = 0;
foreach($CR["img"] as $key => $val){
    $i++;
    if(
    $i%3 == 1
    ){
        if(
        $i <> 1
        ){
            echo '<li class="tp" style="clear:both">';
        } else{
            echo '<li class="tp">';
        }
    } else{
        echo '<li>';
    }
    echo '<div><table><tr><td><a href="/login/image.html?imageinfoid='.h($val).'">';
    echo '<img src="/img.php?i='.h($val).'"';
    //echo '<img src="/login/image.html?imageinfoid='.h($val).'"';
    $x = $CR["img_xy"][$val]["x"];
    $y = $CR["img_xy"][$val]["y"];
    $model = $CR["img_xy"][$val]["model"];
    $rate = 300/225;
    if(
    ($x/$y) > $rate
    ){
        echo ' width="300"';

//} elseif(
//preg_match("/^iPhone/u", $model) and
//$y>$x and
//preg_match("/\(iPhone;/u", $_SERVER["HTTP_USER_AGENT"])
//){
//        echo ' width="225"';
//echo ' style="transform: rotate(270deg);-ms-transform: rotate(270deg);-moz-transform: rotate(270deg);-webkit-transform: rotate(270deg);';


    } else{
        echo ' height="225"';
    }

    echo ' alt="'.h($CR["name"]).'" /></a></td></tr></table></div>';
    $captionname = imgCaptionName($key);
    if(
    mb_strlen($CR[$captionname], "utf8")
    ){
        echo '<span>';
        echo nl2br(h($CR[$captionname]));
        echo '</span>';
    }
    echo '</li>';
}



___ Thanks.
インラインCSS記述で画像を回転表示させる方法
http://digitalkoukisin.seesaa.net/article/299878666.html


104. PHPでExifを操作する
http://itpro.nikkeibp.co.jp/article/COLUMN/20080930/315835/

pel by lsolesen
http://lsolesen.github.io/pel/

PHP で画像を読み込んで、ブラウザに表示させる
http://d.hatena.ne.jp/littlebuddha/20100217/1266421016

php exif情報を削除する
http://thenewglory.blog.fc2.com/blog-entry-30.html

PHP -> Exif インストール手順
http://www.php.net/manual/ja/exif.installation.php

Apacheのインストールと初期設定 
http://fedora2myserver.blog20.fc2.com/blog-entry-33.html