【PHP】ページ表示時に動的にサムネイル画像を作る4つの方法
2018/03/05
PHP及び、CakePHPで作成しているサイトのリストページ等で画像を扱う際に、指定画像のサムネイルがあると便利ということで、サムネイルを作る便利スクリプトやサイトを4種類紹介します。
動的にサムネイルを作成するスクリプト / サービス
ちなみにどうでもいいことですが、サムネイルとは「thumbnail」と書き、直訳すれば「親指の爪」。親指(thumb)の爪(nail)のように小さく簡潔であるという意味から来ています。
間違っても画像名を sample_sum.jpg とかしちゃ恥ずかしい目に合うので注意ですよ。
気をつけろ、10年ほど前のオレ。
(1) 動的にサムネイルを作成、表示
aki-web PHP Scripts
http://aki.adam.ne.jp/php/script/thumb.php
imgタグで画像を表示の際に、リアルタイムでサムネイル化し表示してくれるスクリプト。
使い方
<img src="thumb.php?path=(ファイルへの相対パス)[&maxwidth=(横の最大サイズ)][&maxheight=(縦の最大サイズ)][&maxsize=(長辺の最大サイズ)]" />
※ファイルへの相対パスは,thumb.php からの相対パスで指定します。
※maxsize は maxwidth と maxheight にそれぞれ同じ値を設定したのと同じ扱いです。
とのことなので、横を100pxとして表示する方法は以下のようにすればOK。
1 |
<img src="thumb.php?path=path/to/image&maxwidth=100" alt="" /> |
(2) phpThumbnailer
Hidayet Doğan
http://hi.do/?s=phpThumbnailer
トルコ語で書かれているサイトですが、PHPは読めます。ええ。
tar.gnをDLして、解凍してください。
動作環境はPHP+GD。
1 2 3 4 5 |
<?php include("../class.Thumbnail.php"); $tn_image = new Thumbnail("sample.jpg", 300, 300, 0); $tn_image->show(); ?> |
これだけで、サムネイルが表示されます。
saveメソッドを使えば、保存も可能。
1 2 3 4 5 |
<?php include("../class.Thumbnail.php"); $tn_image = new Thumbnail("sample.jpg", 300, 300, 0); $tn_image->save("sample_thumb.jpg"); ?> |
恐ろしく簡単。
(3) CakePHPのThumbnailヘルパー
[CakePHP] Thumbnailヘルパー(サムネイル画像) Web Sytem | AIDREAM
http://blog.aidream.jp/cakephp/cakephp-thumbnail-helper-185.html
前述した「phpThumbnailer」と組み合わせて使う、CakePHP用のヘルパーが AIDREAM 様サイトにて公開されていますのでご紹介。
サムネイル化対象の画像と同じディレクトリ内に sample_100_50.jpg のような形でサムネイル画像を作成してくれます。
なんですが、所々不具合があり動かないので、一部修正したものをコチラで公開させて頂きます。
マズかったら一言お願い致します。
使い方
ライブラリ設置
class.Thumbnail.php ライブラリを /app/vendors/classThumbnail/ ディレクトリを作成し以下に設置
NO IMAGE画像を設置
no_img_default.gifを、app/webroot ディレクトリ内に設置
コントローラー内でヘルパー宣言
1 |
var $helpers = array('AppThumbnail'); |
app.phpへの設定
1 |
define('SITE_URL', 'http://store-e-broad.localhost/'); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
<?php /** * Thumbnail Helper * for CakePHP 1.3.x */ App::import('Vendor', 'phpThumbnail', array('file' => 'class.Thumbnail.php')); class AppThumbnailHelper extends Helper { var $no_img = 'img/no_image.jpg'; // app/webrootディレクトリ内のNoImage画像のパス /** * 画像ファイルの有無を確認 * @param string $relative_path 相対パス(app/webrootディレクトリ内のパス) */ function isImg($relative_path = null) { $absolute_path = WWW_ROOT . $relative_path; // 絶対パス if (file_exists($absolute_path) && is_file($absolute_path) && is_readable($absolute_path) === true && filesize($absolute_path) > 0) { return true; } else { return false; } } /** * 画像ファイルのリサイズ処理 * @param string $relative_path 元画像の相対パス(app/webrootディレクトリ内のパス。存在しない場合、NoImage画像を使用。) * @param int $max_width 横幅の最大値 * @param int $max_height 高さの最大値 * @param boolean $generation 画像を生成するか否かの真偽値 */ function resizeImg($relative_path = null, $max_width = null, $max_height = null, $generation = false) { if (empty($relative_path)) { $relative_path = $this->no_img; } // 画像の情報を取得 list($width, $height, $type, $attr) = getimagesize(SITE_URL.$relative_path); // 画像の横幅・高さ・形式・属性 $_info = pathinfo($relative_path); // 拡張子をのぞいたファイル名 $filename = $_info['filename']; $type = !empty($type) ? $type : 2; // 画像の形式が取得できない場合、デフォルトで 2(jpgの意)を格納 $ext = $this->getImgExtensions($type); // 拡張子 // リサイズが可能な場合(アスペクト比を固定してリサイズ) if (!empty($width) && !empty($height) && !empty($max_width) && !empty($max_height)) { $is_longer_width = (($width - $height) > 0) ? true : false; // 横幅のほうが縦より長いか否か $width_rate = $max_width / $width; $height_rate = $max_height / $height; // 「横幅の最大値」よりも「元画像の横幅」が大きく、かつ、「元画像の高さ」よりも「元画像の横幅」が大きい場合 if ($width_rate < 1 && $is_longer_width === true) { $resize_width = $max_width; // リサイズ後の横幅 $resize_height = round($height * $width_rate); // リサイズ後の高さ(小数点以下を四捨五入) // 「高さの最大値」よりも「元画像の高さ」が大きい場合 } elseif ($height_rate < 1) { $resize_width = round($width * $height_rate); // リサイズ後の横幅(小数点以下を四捨五入) $resize_height = $max_height; // リサイズ後の高さ } $resize_path = $_info['dirname'] . DS . $filename.'_'.$max_width.'-'.$max_height.$ext; // リサイズ後の画像のパス // リサイズ画像の生成を指定、かつ、リサイズ画像が存在しない場合 if ($generation === true && $this->isImg($resize_path) === false) { $thumbnail = new Thumbnail(WWW_ROOT.$relative_path, $max_width, $max_height, null, '80'); $thumbnail->save(WWW_ROOT.$resize_path); } // リサイズ処理後の画像の情報を返す $attr = 'width='.$resize_width.' height='.$resize_height; // 画像の属性 return array( 'width' => $resize_width, 'height' => $resize_height, 'attr' => $attr, 'type' => $type, 'ext' => $ext, 'path' => $resize_path, ); // リサイズが可能ではない場合 } else { // 画像の情報を返す return array( 'width' => '', 'height' => '', 'attr' => '', 'type' => $type, 'ext' => $ext, 'path' => $relative_path, ); } } /** * 画像の拡張子 */ function getImgExtensions($key = null) { $arr = array( 1 => '.gif', 2 => '.jpg', 3 => '.png' ); return isset($arr[$key]) ? $arr[$key] : $arr; } } |
ビュー内での記述
1 2 |
$thumb = $appThumbnail->resizeImg('path/to/sample.jpg', 100, 50, true); echo $html->image('/'.$thumb['path'], aa('alt','')); |
ビュー内の表記で、絶対パスにする場合は最初に「/」を連結させてください。
(4) ImageThumbnailer
ImageThumbnailer powered by GoogleAppEngine for Java
http://imgthum.appspot.com/
最後に、サムネイルを作成してくれ、1日キャッシュしてくれるサービス。
自力で作成することなく、リンクすれば作ってくれるという有り難いサービスとなっております。
このサイトは、URLの末端に画像へのURLを指定することによって縦横最大400pxのサムネイル画像を直接出力するGoogleAppEngineを利用したクラウドサービスです。出力されるサムネイルはPNG形式で出力されます。
出力するサムネイルの大きさを指定することも可能です。指定しない場合は100px * 100pxのサムネイルを生成します。
生成されたサムネイルは、1日の間キャッシュされます。
使い方
ということで、横サイズを100pxとする場合のサンプルは以下の様に指定。
1 |
<img src="http://imgthum.appspot.com/100/http://example.com/img/image.jpg" alt="" /> |
以上です。