- 一旦、縦横を保ったまま画像を縮小(拡大)する(※ 長い方の辺に合わせる)
- 中心からの距離を計算(x / 2, および y / 2)して、左上の座標、各辺の長さを計算する
// ---------------------------------------------------
// JPEG画像の縦横比を保ったままリサイズして指定サイズで切り抜くサンプル
// ---------------------------------------------------
// 入力ファイル
$filename1 = '001_01.jpg';
// 出力ファイル
$filename2 = '001_02.jpg';
// 完成画像のサイズ
$dst_w = 600;
$dst_h = 250;
// ---------------------------------------------------
// 入力ファイルの縦横サイズを調べる
list($src_w, $src_h, $type) = getimagesize($filename1);
// 入力ファイル読み出し
$src_image = imagecreatefromjpeg($filename1);
var_dump($src_w, $src_h, $type);
// ---------------------------------------------------
// 完成画像が横長画像
// ---------------------------------------------------
if ($dst_w > $dst_h) {
// ① 横幅をあわせて縦横比を保ったまま縮小拡大する
$dst_h_work = $src_h * ($dst_w / $src_w);
var_dump($dst_w, $dst_h_work);
$dst_image = imagecreatetruecolor($dst_w, $dst_h_work);
imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $dst_w, $dst_h_work, $src_w, $src_h);
// ② 左上の位置を中心から算出
$dst_x = 0;
$dst_y = ($dst_h_work / 2) - ($dst_h / 2);
// ---------------------------------------------------
// 完成画像が縦長画像
// ---------------------------------------------------
} else {
// ① 縦幅をあわせて縦横比を保ったまま縮小拡大する
$dst_w_work = $src_w * ($dst_h / $src_h);
var_dump($dst_w_work, $dst_h);
$dst_image = imagecreatetruecolor($dst_w_work, $dst_h);
imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $dst_w_work, $dst_h, $src_w, $src_h);
// ② 左上の位置を中心から算出
$dst_x = ($dst_w_work / 2) - ($dst_w / 2);
$dst_y = 0;
}
var_dump($dst_x, $dst_y);
// 指定した位置とサイズで切り抜く
$dst_image = imagecrop($dst_image, ['x' => $dst_x, 'y' => $dst_y, 'width' => $dst_w, 'height' => $dst_h]);
// ファイルへ保存
imagejpeg($dst_image, $filename2, 85);
// 破棄
imagedestroy($src_image);
imagedestroy($dst_image);