不定形の投稿された画像からサムネイルを生成したいと思います。
サムネイルは投稿された画像の中心がサムネイルの中心となり且つ100*100サイズとなるようにしたいと思いますが、どのようにすれば良いでしょうか?
execコマンドを教えていただければと思います。よろしくお願いいたします。
imagemagickを使わなくても、短い辺の長さにあわせた画像を作成し、その後、PHPで100×100の画像を作って、それに当てはめればできます…。
// 画像の幅と高さを取得します(画像ファイルのパスを$filepathとします)
list($width, $height) = getimagesize($filepath);
// 画像を取得します(仮にjpegだとします)
$src = imagecreatefromjpeg($filepath);
// 短い辺の長さを100にするように、縮小した後の縦と横の長さを計算します
if ($width > $height) {
// 横長
$width_thumb = ceil($width * 100 / $height);
$height_thumb = 100;
}
else {
// 縦長
$width_thumb = 100;
$height_thumb = ceil($height * 100 / $width);
}
// 100pixel×100pixelの空の新規画像を作成します
$dst = imagecreatetruecolor(100, 100);
// 作った画像に用意した画像をコピー、伸縮します。
imagecopyresampled($dst, $src, ceil((100 - $width_thumb) / 2), ceil((100 - $height_thumb) / 2), 0, 0, $width_thumbs, $height_thumbs, $width, $height);
どうしてもimagemagickを使いたいのであれば、100pixel×100pixelの空の新規画像を作成する前にimagemagickで縮小した画像を作ってから当てはめる形になるかと思います。
(imagemagickのバージョンによって使えないコマンドがあるので注意)
// imagemagickを使う
// (仮に/usr/bin/ にimagemagickの実行ファイルがあると仮定)
// $tmpfilepathはテンポラリーファイルのパスを指定
exec('/usr/bin/convert -geometry '.$width_thumb.'x'.$height_height.' "'.$filepath.'" "'.$tmpfilepath.'"');
または、こちらのページの-resizeというコマンドを使って
ImageMagickで簡単に画像処理 - PHPプロ!TIPS+
// imagemagickを使う
// (仮に/usr/bin/ にimagemagickの実行ファイルがあると仮定)
// $tmpfilepathはテンポラリーファイルのパスを指定
exec('/usr/bin/convert "'.$filepath.'" -resize '.$width_thumb.'x'.$height_height.' "'.$tmpfilepath.'"');
これによってimagecopyresampledの指定が変わってきます。たぶんこうだと思うのですが、間違ってたらごめんなさい。
// 作った画像に用意した画像をコピー、伸縮します。
imagecopyresampled($dst, $tmpfilepath, ceil((100 - $width_thumb) / 2), ceil((100 - $height_thumb) / 2), 0, 0, $width_thumbs, $height_thumbs, $width_thumbs, $height_thumbs);
詳細な回答ありがとうございます。
exec('/usr/bin/convert -geometry '.$width_thumb.'x'.$height_height.' "'.$filepath.'" "'.$tmpfilepath.'"');
を試してみましたがうまくいきませんでした。
$filepathと$tmpfilepathを逆にしたら、このコマンドについてはOKでした!
ただ、最後にphpの関数を使うということですよね?
折角なので、画像生成に関してはすべてimagemgickで行いたいと思います。
最初のgetimagesize($filepath);は初めて知りました。これをうまく使えば座標の計算ができそうですね。
また試してみたいと思います。
ありがとうございました。