4,450 views
この記事は最終更新から 2998日 が経過しています。
やってみたいこと
任意のJPEG画像ファイルをWEBブラウザからアップロードし、指定領域を切り抜いてWEBブラウザに表示する。
ImageMagickではなく GDを使用する。

↓

実行サンプルはこちらです。
//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/
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2025-11-17: 0回 2025-11-16: 1回 2025-11-15: 0回 2025-11-14: 0回 2025-11-13: 0回 2025-11-12: 1回 2025-11-11: 1回