« || »

 PHPで画像表示およびconvertコマンドでサムネイル生成

2020. 1. 9 (木)

何をするもの?

WEBサイト上でデフォルトサイズの画像ファイルを元に自動的にサムネイル画像を作成し、サムネイル画像作成の手間を省くのと通信容量を必要最小限に抑えることを目的としたものです。

動作条件

サーバ上で以下のものが動作することが前提です。

 PHP
 .htaccess 及び mod_rewrite
 ImageMagickのconvertコマンド

ImageMagickはインストールされていてもPHP用ImageMagickモジュール(imagick)まではインストールされていない場合も多いのと、convertコマンドのほうが私にとっては扱いも手っ取り早いのでこちらを使用しています。

設置方法

対象とする画像ファイルのあるディレクトリに
.htaccess
thumbnail.php
をアップロードするだけです。

ファイルをダウンロード

使用方法

WEBブラウザから、通常通り画像がアップロードされているディレクトリのURLを指定します。

https://akebi.jp/thumbnail_sample/sample.jpg

サムネイルを表示する場合は、?t=サイズ オプションを使います。

https://akebi.jp/thumbnail_sample/sample.jpg?t=200
.htaccess に記載した mod_rewrite の記述が、画像ファイル名とそれに付けたクエリパラメータを thumbnail.php に渡す役割をしています。
ここで Internal Server Error が表示された場合は残念ながら convert コマンドが使用できないと思われます。

t= で指定したサイズは、thumbnail.php 内で設定してあるサイズに一番近いものに補正されます。
サイズの種類を増やすこともできますが、あまり多く設定するとその分キャッシュファイル用フォルダも多く作られますので、サーバ容量に余裕がない場合はご注意ください。

その他のクエリパラメータ

s: (squareの略) 正方形でない画像から中央部分を取り出して正方形化
https://akebi.jp/thumbnail_sample/sample.jpg?s

sf: (square fillの略) 正方形でない画像の短辺側に余白色を追加して正方形化
https://akebi.jp/thumbnail_sample/sample.jpg?sf

p: (progressiveの略) JPEG、PNG画像をプログレッシブ(インターレース)化
https://akebi.jp/thumbnail_sample/sample.jpg?p

複数のクエリパラメータを合わせて指定できます。
https://akebi.jp/thumbnail_sample/sample.jpg?t=200&sf

処理の概要

 画像ファイル名が渡される
   ↓
 有効なクエリパラメータは付いているか
   │       ↓
 付いている   付いていない
   │       ↓
   │     オリジナルの画像をそのまま表示
   ↓
 クエリパラメータに対応する画像キャッシュファイルは存在するか
   │       ↓
 存在しない   存在する
   │       ↓
   │     対応する画像キャッシュファイルをそのまま表示
   ↓
 convert コマンドにて対応する画像キャッシュファイルを生成、表示

convert コマンドで作成された画像はサーバ側にキャッシュすることで、以降同じ条件のパラメータで呼ばれた場合には無駄に convert コマンドが実行されないようにしています。

画像ファイル表示処理に関しても、ブラウザから受け取ったリクエストヘッダ内に If-None-Match ヘッダがあるかを確認し、If-None-Match があって画像に対応する ETag との比較結果が一致していれば、HTTP レスポンスステータスとして Not Modified を渡し画像データ自体は送信しないことで、ブラウザ側のキャッシュファイルを有効に働かせ無駄に通信も行なわないようにしています。

使用を中止する場合

画像ディレクトリにアップロードした .htaccess と thumbnail.php 、thumbnail.php によって作成された thumbnail から始まるディレクトリとその中の画像キャッシュファイルを削除して下さい。

参考

ImageMagick Command-line-Tools: Convert
MDN HTTPヘッダー

« || »

Comments are closed.