(13) PHPからLinuxシェルを実行して高速画像処理

投稿者: | 2016年10月25日

1,391 views

この記事は最終更新から 2627日 が経過しています。

やってみたいこと

「(9) GDでアップロード画像を白黒画像に変換」 で作成したプログラムのように、ピクセル単位の画像処理をPHPで実行すると処理速度が遅い。そこで、画像処理自体は外部プログラムに実行を依頼し、その実行結果をPHPで使わせてもらうようにしたい。
すなわち、PHPから外部プログラムを実行したい。
 
実行サンプルはこちらです。
http://www.dogrow.net/php/sample/00013/

「(9) GDでアップロード画像を白黒画像に変換」と比較すると圧倒的に高速に処理できる!

プログラム作成

プログラムの仕様は以下の通り。
・指定された画像ファイルを ImageMagicksの convert コマンドを使って白黒画像に変換する。
・作成した画像をサーバー上にファイル出力し、これをWEBブラウザ上で表示する。

index.php

<!DOCTYPE html>
<HTML>
<HEAD>
<META CHARSET="UTF-8" />
<TITLE>サンプル</TITLE>
</HEAD>
</BODY>
<?php
  // 画像変換処理要求?
  if(isset($_POST['exec'])){
    try{
      if(is_uploaded_file($_FILES['upfile']['tmp_name'])){
        // アップロードされた画像を保存
        move_uploaded_file($_FILES['upfile']['tmp_name'], 'tmp.img');
        // 画像変換&表示
        $img_out = image_convert('tmp.img');
        if($img_out != ""){
          echo "<img src=\"$img_out\">";
        }
      }
    }catch(Exception $e){
      echo "[".__LINE__."] Caught exception: ".$e->getMessage();
    }
  }
?>
<hr />
<form enctype="multipart/form-data" action="./" method="post">
<input type="file" name="upfile"><br />
<input name="exec" type="submit" value="カラー画像をグレースケール画像に変換します。(一辺2000ピクセル以下)">
</form>
</BODY>
</HTML>

<?php
/////////////////////////////////////////
// 入力画像を白黒画像に変換
function image_convert( $fpath_in ){
  $fpath_out = "";
  // 入力画像の情報を取得
  $ary_info = getimagesize( $fpath_in );
  if($ary_info !== FALSE){
    // 巨大画像は処理しない。
    if($ary_info[0] > 2000){ exit; }
    if($ary_info[1] > 2000){ exit; }
    // 画像ファイル形式に対応した拡張子のファイル名を作成
    $fpath = "img_result".image_type_to_extension($ary_info[2]);
    // convertコマンドを使って白黒画像を作成
    exec("convert $fpath_in -type Grayscale $fpath", $resp, $code);
    if($code != 0){
      echo "Error<hr />";
    }else{
      echo "Done!<hr />";
      $fpath_out = $fpath;
    }
  }
  return $fpath_out;
}
?>

 
実行サンプルはこちらです。
http://www.dogrow.net/php/sample/00013/


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)