GDを使ってサムネイル画像を生成する。

電脳備忘録
googleのページスピードオンラインというサービスでこのブログを評価したら、20/100であまりにもアレだったので対応することにしました。トップページの画像はcssで縮小して表示しているのがコレが良くないみたいです。いろいろ考えGDでサムネイルを作ってそれを表示することにしました。

GDはMovableTypeでサムネイルを生成するのに必要なのでインストールはしていましたが、自分でコードを書いてサムネイルを生成したことはなかったので勉強になりました。今回はMovableTypeでエントリー更新時に生成されるサムネイルとは別のサイズの画像を作りたいといったニッチな使い方です。

注意

これよ以下の方法だと再構築時にサムネイルが生成されないことがわかりました。別ファイルに書いてスタティックにしておけば再構築時にそのコードを元に画像が生成できると考えたのですが、この方法はダメみたいです。書き直したのでそちらを参照してください。

お約束

毎度のことですが、参照は自己責任でお願いいたします。

参照させていただいたエントリー
【PHP】GDライブラリを使って画像のサムネイルを作成する。

サムネイル画像の生成

インデックステンプレートの生成 テンプレート名:サムネイル生成
出力ファイル名:/thumbnail/config.php
公開:スタティック
※テンプレート名・出力ファイル名は環境ごとに読み替えてください。
‹$MTAssetFileName$›・・・ファイル名を取得
<mt:MultiBlog blog_ids="2,3" mode="context">
<MTEntries>
<mt:If tag="EntryDataEyecatch_image">
<MTEntryDataEyecatch_imageAsset>
&lsaquo;?php
$file_path = "<$MTAssetThumbnailURL$>";//読み込むファイルの指定
$image = ImageCreateFromJPEG($file_path);//ファイルの読み込み
$width = ImageSX($image); //横幅(ピクセル)
$height = ImageSY($image); //縦幅(ピクセル)
$new_width = 200;
$rate = $new_width / $width; //圧縮比
$new_height = $rate * $height;
$new_image = ImageCreateTrueColor($new_width, $new_height);//空画像の作成
ImageCopyResampled($new_image,$image,0,0,0,0,$new_width,$new_height,$width,$height);// サンプリングしなおす
$thumbnail_path ="/thumbnail/<$MTAssetFileName$>";//ファイルの保存先を指定
ImageJPEG($new_image, $thumbnail_path, 70);//保存する
imagedestroy ($dst_img);//メモリの開放
imagedestroy ($src_img);//メモリの開放
?&rsaquo;
</MTEntryDataEyecatch_imageAsset>
</mt:If>
</MTEntries>
</mt:MultiBlog>

記事を生成したときにthumbnailディレクトリに横200pxの画像が生成されているのを確認。

生成したサムネイルの表示

保存した画像を表示する。

&lsaquo;?php
$thumbnail_path ="/thumbnail/<$MTAssetFileName$>";//表示する画像のURLを指定
$image = ImageCreateFromJPEG($thumbnail_path);//ファイルの読み込み
$width = ImageSX($image); //横幅(ピクセル)
$height = ImageSY($image); //縦幅(ピクセル)
//画像を表示
print "<img src='../thumbnail/<$MTAssetFileName$>' width='$width' height='$height' alt='<mt:EntryTitle>' title='<mt:EntryTitle>' />";
//念のためメモリを開放しておく
imagedestroy ($dst_img);
imagedestroy ($src_img);
?&rsaquo;

早くなったかどうかはわかりませんが20→39に評価が上がりました・・・。
あとmemchacedを設定していたのですが、それが原因でGDがエラーをはいていたので、php.ini内のmemchaced関連の記述をコメントアウトし読み込まないようにしました。memchacedを使うときは適切な設定をしてあげないとあちらこちらでエラーをはくみたいなので、私のようなちゃんとわかってない人は取扱注意ですね。これについては別途原因を調査します。毎日何かしらあって勉強にはなるのだけどなんとも・・・

広告

ブログの維持費に充てるでございます・・・。