画像をアップロードした後にサムネイルを生成するというのは、一般的にWebサイトではよくある機能のはずですが、例えば最近作ったWebサイトでは、サムネイルのサイズを同じにするのが一般的です。全て160×120です。ただし、アップロードした画像の比率がサムネイルと一致していない場合、直接拡大縮小すると画像が変形してしまい、操作性は確実に悪くなります。そこで筆者は、サイズを縮小した後に白いエッジを追加するという妥協策を考えました。
ソース画像、サイズは600×366:
最終レンダリング:
コードは比較的長いので、アイデアについて簡単に説明しましょう:
まずソース画像に比例してサムネイルを生成します。幅は 160 を超えず、高さは 120 を超えてはなりません。たとえば、上の画像は最初に 160×98 のサムネイルを生成します。
新しい160×120の白い背景画像を作成し、前の手順で生成したサムネイルをこの画像の中央に配置すればOKです。
最終的なコードは次のとおりです:
//ソース画像オブジェクト
$src_image = imagecreatefromstring(file_get_contents($src_path));
$src_width = imagex($src_image);
$src_height = imagey($src_image);
//等しい比率のサムネイルを生成します
$tmp_image_width = 0;
$tmp_image_height = 0;
if ($src_width / $src_height >= $width / $height) {
$tmp_image_width = $width;
$tmp_image_height =round ($tmp_image_width * $src_height / $src_width);
} else {
$tmp_image_height = $height;
$tmp_image_width =round($tmp_image_height * $src_width / $src_height);
}
$tmpImage = imagecreatetruecolor($tmp_image_width, $tmp_image_height);
imagecopyresampled($tmpImage, $src_image, 0, 0, 0, 0, $tmp_image_width, $tmp_image_height, $src_width, $src_height);
//白いエッジを追加します
$final_image = imagecreatetruecolor($width, $height);
$color = imagecolorallocate($final_image, 255, 255, 255);
imagefill($final_image, 0, 0, $color);
$x =round(($width - $tmp_image_width) / 2);
$y =round(($height - $tmp_image_height) / 2);
imagecopy($final_image, $tmpImage, $x, $y, 0, 0, $tmp_image_width, $tmp_image_height);
//出力画像
header('Content-Type: image/jpeg');
imagejpeg($final_image);