[PHP] 画像のサムネイルを作成するプログラム【解説編】

2019年8月17日

テクノロジー プログラミング

t f B! P L
昨日、PHPでサムネイル作成するプログラムを掲載しましたが、内容解説を書き忘れていたので、本記事にて説明したいと思います。 前回記事 : [PHP] 画像のサムネイルを作成する方法 ちなみに、このプログラムはPHPのGDライブラリを使用しているので、インストールされていない環境の場合は、追加インストールをした上でご使用ください。 さらに余談ですが、GDライブラリではなく、Imagemagickを使って操作をすると、画質良く作業できるかもしれませんが、今回はGD専用です。

GDライブラリの便利関数

https://www.php.net/manual/ja/book.image.php リファレンスページにGDライブラリの関数一覧が載っているのですが、ここの全てをおぼえておく必要がありません。 今回はサムネイル作成が目的だったので、画像の読み込みと、拡縮やトリミングができればよかったので、以下の関数のみを利用しました。 ImageCreateFromJpeg() imagesx() imagesy() imagescale() imagecreatetruecolor() imagecopyresized() imagejpeg() imagedestroy() こうやって書き出してみると、意外と個数はありますね。 少し面倒くさいと感じたのは、今回はjpegのみしか使っていなかったのですが、pngやgif画像を使う時は、読み込み関数が違うという点です。 もちろん、それぞれの画像フォーマットに必要な仕様があり、jpegフォーマットであれば、圧縮率の扱いであったり、gifであれば、カラーパレットの扱いなど、それぞれの扱い方の差が出るのは事前に理解して置かなければいけません。 jpegの元データがある場合に、ImageCreateFromJpeg()を使って変数に格納しておき、 imagesx(),imagesy()を使って、画像サイズを取得したり、 imagescale()を使ってリサイズを行い、 最後にimagedestroy()で、変数格納しているデータを開放するという流れになります。

サイズ計算のあれこれ

サムネイル作成に関して、少し頭を使った点としては、「サイズの計算」が一番しんどかったです。 元ファイルの画像サイズは一定ではなく、縦幅、横幅のサイズも比率も全て違っている事が前提で作るため、サムネイルと一言で言っても、縦横比は、画像に合わせた比率にするのか、指定サイズにピッタリと合わせるようにするのかもオプションモードで切り分けられるようにしておきました。 また、GDライブラリの機能で、リサイズの時に、横サイズを指定して縦サイズを-1などの負の値にしておけば、自動的に比率を合わせた値で出力してくれるという機能があります。 https://www.php.net/manual/ja/function.imagescale.php 上記リファレンスページにも書かれていますが、この際に縦幅固定のサイズが対応していないのが分かるので、柔軟に使いたい場合は、こうした場合にも対応できるようにしています。 スケール方法は、cssにもある"contain"と"cover"というモードをそのまま使わせてもらったのですが、 "contain"は元画像のサイズ比率をそのまま縮小画像にも摘要するもので、画像をそのまま小さくしたサムネイルになります。 縦、横、どちらかを基準にして、もう片方を同じ比率で縮小することで簡単に実現できます。 一方、"cover"は、指定する画像サイズで、元画像を縮小して切り抜くやり方で、画像一覧を並べる時などに、空きスペースが出なくて、見た目が良くなるという特徴があります。 また、サイズ固定のアイコンやファビコンなどとしてつかえるので、こちらもニーズはあります。 計算は若干面倒際のですが、指定サイズにピッタリフィットするように、縮小して、はみ出した部分を切り抜くというやり方で実現できます。 ただし、切り抜き方も、中央を抜く場合と、端切り抜きの場合もあり、突き詰めると面倒くさい機能になります。

画像の抜き出しで一苦労

実は画像の切り抜きで苦労した点として、下記imagegetclip()関数を使えば簡単にできるとタカをくくっていたのですが、エラーが出て開発が先に進まなくなりました。 https://www.php.net/manual/ja/function.imagegetclip.php リファレンスページを良く見てみると、PHP7.2以上の機能になるとのことで、色々な環境で使うフレームワークの特性を考えたらこの関数は使わないほうが良さそうな感じだったので、imagecopyresized()で代用するようにしました。 この場合、最初に縮小処理をしたあとで、の切り抜き処理になるので、手数は増えますが、下位互換を考えると必要な処理であると考えられます。

今後必要な機能

今回はサムネイル作成という事でほぼリサイズと切り抜き作業だけでしたが、写真素材を扱う場合など、exif情報を扱ったり、orientationデータに対応したりすると、機能追加が必要な事は見えています。 とりあえず、亀足ですが、コツコツと自分用関数を作り貯めて行くことが重要ですね。 その際に、PHPのバージョン依存した対応も忘れないようにしましょうね。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ