PHPで読み込んだ画像のサイズを調整して適切なサイズに変更したい場合の方法です。
画像オブジェクトにsetSize(x, y)みたいに新しいサイズを指定できるんかなと思ったけどそんな簡単なものは無かったです。
全体の流れとしては、リサイズ後のサイズの新しい画像を用意して、リサイズ前の画像をそこにコピーするという感じです。
ややこしいけどそういう方法しか無いみたいですね。
さっそくやってみましょう。
PHPで読み込んだ画像のサイズを変更する方法
imagecopyresampled()の使い方
リサイズの肝になる関数がimagecopyresampled()という関数です。
この関数は引数が多いです(笑)
$dst_image, // コピー先の画像
$src_image, // コピー元の画像
$dst_x, // コピー先の x 座標
$dst_y, // コピー先の y 座標
$src_x, // コピー元の x 座標
$src_y, // コピー元の y 座標
$dst_w, // コピー先の幅
$dst_h, // コピー先の高さ
$src_w, // コピー元の幅
$src_h) // コピー元の高さ
リサイズの場合は、$dst_x、$dst_y、$src_x、$src_yは使わずに0を入れます。
というかどういう風に使うか分かってません。すみません。使ったことがないです。
後はコピー先とコピー元の画像とサイズを取得してセットすればOKです。
実際にリサイズしてみた
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// リサイズ前画像ファイル名 $imageFile1 = "neko.jpg"; // リサイズ後画像ファイル名 $imageFile2 = "neko2.jpg"; // コピー先画像サイズ指定 $dst_w = 384; $dst_h = 256; // コピー先画像作成 $dst_image = imagecreate($dst_w, $dst_h); // コピー元画像読み込み $src_image = imagecreatefromjpeg($imageFile1); // コピー元画像のサイズ取得 $imagesize = getimagesize($imageFile1); $src_w = $imagesize[0]; $src_h = $imagesize[1]; // リサイズしてコピー imagecopyresampled( $dst_image, // コピー先の画像 $src_image, // コピー元の画像 0, // コピー先の x 座標 0, // コピー先の y 座標。 0, // コピー元の x 座標 20, // コピー元の y 座標 $dst_w, // コピー先の幅 $dst_h, // コピー先の高さ $src_w, // コピー元の幅 $src_h); // コピー元の高さ // 画像をファイルに出力 imagejpeg($dst_image, $imageFile2); |
縦横比が異なると画像が変形してしまいます。
例えば、今回は猫の画像を使いました。
これを正方形になるように300×300でリサイズすると次のようになります。
猫ちゃんがちょっと縦長になってしまいましたね。
縦長にならないように画像を正方形にしてみた
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
// リサイズ前画像ファイル名 $imageFile1 = "neko.jpg"; // リサイズ後画像ファイル名 $imageFile2 = "neko2.jpg"; // コピー先画像サイズ指定 $dst_w = 300; $dst_h = 300; // コピー先画像作成 $dst_image = imagecreate($dst_w, $dst_h); // コピー元画像読み込み $src_image = imagecreatefromjpeg($imageFile1); // コピー元画像のサイズ取得 $imagesize = getimagesize($imageFile1); $src_w = $imagesize[0]; $src_h = $imagesize[1]; // 縦はそのままで左右を削除 $zm = $src_h / $dst_h; $yoko = $src_w / $zm; $yohaku = ($yoko - $dst_w) / 2 * -1; // リサイズしてコピー imagecopyresampled( $dst_image, // コピー先の画像 $src_image, // コピー元の画像 $yohaku, // コピー先の x 座標 0, // コピー先の y 座標。 0, // コピー元の x 座標 0, // コピー元の y 座標 $yoko, // コピー先の幅 $dst_h, // コピー先の高さ $src_w, // コピー元の幅 $src_h); // コピー元の高さ // 画像をファイルに出力 imagejpeg($dst_image, $imageFile2); |
「// 縦はそのままで左右を削除」の部分で、縦幅をベースに縮小の比率を出し、縮小後の横幅を同様に算出する。
縮小後の横幅からリサイズ後画像の幅を引き、それを2で割れば片方の余りが算出できます。-1を掛けたのはX座標を左にずらすためです。
そして、imagecopyresampled()で、コピー先の幅に縮小後の横幅を指定し、はみ出す分をコピー先の x 座標に片方の余りを指定することで画像が左右中央になります。
これで出力したら正方形で縦長になったりせず、中央に表示された画像が作成できました。
座標の使い方が少し分かった気がします。
なんだか解像度が落ちたような・・・
まとめ
PHPで読み込んだ画像のサイズを変更するのは、変更というより新しいサイズのまっさらな画像にコピーするイメージですね。
まずコピー先画像をimagecreate()を使って用意。
コピー元画像をimagecreatefromjpeg()で読み込む。
コピー元画像のサイズをgetimagesize()で取得する。
imagecopyresampled()を使い、画像をリサイズしつつコピーする。
imagejpeg()で画像を出力する。
以上でした。
コメントを残す