(11) GDでアップロード画像を切り抜き

投稿者: | 2016年10月24日

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

やってみたいこと

任意のJPEG画像ファイルをWEBブラウザからアップロードし、指定領域を切り抜いてWEBブラウザに表示する。
ImageMagickではなく GDを使用する。

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

プログラム作成

プログラムの仕様は以下の通り。
・変換可能な画像形式は JPEG, PNG, GIFの3種類とする。
・入力画像は一辺が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_crop.php?fpath=tmp.img&x=".$_POST['x']."&y=".$_POST['y']."&w=".$_POST['w']."&h=".$_POST['h']."\">";
      }
    }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>始点X [pixel]</th><td><input type=text name=x value="0"></td></tr>
  <tr><th>始点Y [pixel]</th><td><input type=text name=y value="0"></td></tr>
  <tr><th>幅    [pixel]</th><td><input type=text name=w value="100"></td></tr>
  <tr><th>高さ  [pixel]</th><td><input type=text name=h 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 />
・出力画像サイズは入力画像サイズよりも小さいものとする。
</p>
</form>

</BODY>
</HTML>

img_crop.php

<?php
crop_img($_GET['fpath'], $_GET['x'], $_GET['y'], $_GET['w'], $_GET['h']);

// 画像変換&出力
function crop_img( $fpath, $x, $y, $w, $h ){

  // 画像情報を取得
  $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;
  }

  // 切り抜き始点範囲チェック
  $x = max(0,        $x);
  $x = min($img_w-1, $x);
  $y = max(0,        $y);
  $y = min($img_h-1, $y);
  // 切り抜きサイズ範囲チェック
  $w = max(1, $w);
  $w = min($img_w - $x, $w);
  $h = max(1,           $h);
  $h = min($img_h - $y, $h);
  // 矩形指定
  $rect = array();
  $rect['x'] = $x;
  $rect['y'] = $y;
  $rect['width'] = $w;
  $rect['height'] = $h;

  // 画像処理を選択
  $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 );
  $im_out = imagecrop($im_in, $rect);

  // 画像出力
  $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/00011/


コメントを残す

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


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