(10) GDでアップロード画像を拡大・縮小

投稿者: | 2016年10月24日

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

やってみたいこと

任意のJPEG画像ファイルをWEBブラウザからアップロードし、指定サイズに拡大・縮小してWEBブラウザに表示する。
ImageMagickではなく GDを使用する。

sample_org
 ↓
sample_mini
 
実行サンプルはこちらです。
//www.dogrow.net/php/sample/00010/

プログラム作成

プログラムの仕様は以下の通り。
・変換可能な画像形式は JPEG, PNG, GIFの3種類とする。
・入力画像は一辺が20~1000ピクセルの画像を処理対象とする。
・出力画像サイズは一辺が20~1000ピクセルの範囲で指定可能とする。

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');
        // 画像変換&表示
        echo "<img src=\"img_resize.php?fpath=tmp.img&w=".$_POST['w']."\">";
      }
    }catch(Exception $e){
      echo "[".__LINE__."] Caught exception: ".$e->getMessage();
    }
  }
?>
<hr />
<form enctype="multipart/form-data" action="./" method=post>
<table style="border:2px #000 solid">
  <tr><th>画像ファイル</th><td><input type="file" name="upfile"></td></tr>
  <tr><th>変更後の画像幅 [pixel]</th><td><input type="text" name="w" value="100"></td></tr>
</table>
<input name="exec" type="submit" value="JPEG,PNG,GIF画像のサイズを変更します。">
<p style="border:2px #f00 solid;color:#f00;padding:2px;">
・変換可能な画像形式は JPEG, PNG, GIFの3種類とする。<br />
・入力画像は一辺が20~1000ピクセルの画像を処理対象とする。<br />
・出力画像サイズは一辺が20~1000ピクセルの範囲で指定可能とする。
</p>
</form>
</BODY>
</HTML>

img_resize.php

<?php
resize_img($_GET['fpath'], $_GET['w']);

// 画像変換&出力
function resize_img( $fpath, $w ){

  // 画像情報を取得
  $ary_info = getimagesize( $fpath );
  if($ary_info === FALSE){
    goto tagEND;
  }
  $img_w    = $ary_info[0];
  $img_h    = $ary_info[1];
  $img_type = $ary_info[2];

  // 画像サイズチェック
  if(($img_w > 1000) || ($img_h > 1000)){
    goto tagEND;
  }
  if(($img_w < 20) || ($img_h < 20)){
    goto tagEND;
  }

  // 画像処理を選択
  $func_create  = NULL;
  $func_display = NULL;
  switch( $img_type ){
  case IMAGETYPE_JPEG:
    $func_create  = "imagecreatefromjpeg";
    $func_display = "imagejpeg";
    break;
  case IMAGETYPE_PNG:
    $func_create  = "imagecreatefrompng";
    $func_display = "imagepng";
    break;
  case IMAGETYPE_GIF:
    $func_create  = "imagecreatefromgif";
    $func_display = "imagegif";
    break;
  default:
    break;
  }
  if($func_create === NULL){
    goto tagEND;
  }

  // 画像をリサイズ
  $im_in  = $func_create( $fpath );
  $dst_w = $w;
  $dst_h = max(intval($img_h * $w / $img_w), 1);
  $im_out = imagecreatetruecolor($dst_w, $dst_h);
  imagecopyresampled($im_out, $im_in, 0, 0, 0, 0, $dst_w, $dst_h, $img_w, $img_h);

  // HTTP応答として画像を出力
  $mime_type = image_type_to_mime_type( $img_type );
  header("Content-Type: ".$mime_type);
  $func_display( $im_out );
  imagedestroy( $im_in );
  imagedestroy( $im_out );
tagEND:
}
?>

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


コメントを残す

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


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