色んなサイズの画像を、指定した大きさ&比率的にはみ出る部分は切り落とすサムネイル画像を生成するには、cropThumbnailImageを使うと簡単にできます。
が、縦長の画像は、人物の画像だったりすると、顔が切れるという残念な結果になるので、『縦長の画像は上部が重要』という仮説のもと、縦長画像は上の方を切り取るようにします。
$im = new Imagick(realpath($file_path));
$size = $im->getImageGeometry();
if ($size['width'] < $size['height']) {
// 縦長なので上部を正方形に切る
$im->cropImage($size['width'], $size['width'], 0, 0);
}
$im->cropThumbnailImage($thumbnail_width, $thumbnail_height);
$im->writeImage($thumbnail_path);
東京タワーとか高層ビルとかの縦長画像でも、真ん中切り取るより上の方切り取るほうがいいと思うので、簡単だし、まぁ良さそうかな。
ちなみにImageMagickは相対パスだとうまく読み込まなかったりするので、realpath()
を使っています。
ただしrealpath()
は存在するファイルやディレクトリに対してしか使えないので、新しく作成する画像のパスに対して$im->writeImage(realpath($thumbnail_path))
とかやるとダメです。
その場合は$im->writeImage(realpath($thumbnail_dir) . '/new_file.jpg')
とかにする必要があります。