eyecatch php

PHP

【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。
[html]
<img src="thumb.php?path=path/to/image&maxwidth=100" alt="" />
[/html]

(2) phpThumbnailer

Hidayet Doğan
http://hi.do/?s=phpThumbnailer

トルコ語で書かれているサイトですが、PHPは読めます。ええ。
tar.gnをDLして、解凍してください。

動作環境はPHP+GD。

[php]
<?php
include("../class.Thumbnail.php");
$tn_image = new Thumbnail("sample.jpg", 300, 300, 0);
$tn_image->show();
?>
[/php]

これだけで、サムネイルが表示されます。

saveメソッドを使えば、保存も可能。
[php]
<?php
include("../class.Thumbnail.php");
$tn_image = new Thumbnail("sample.jpg", 300, 300, 0);
$tn_image->save("sample_thumb.jpg");
?>
[/php]

恐ろしく簡単。

(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 ディレクトリ内に設置

コントローラー内でヘルパー宣言

[php]
var $helpers = array('AppThumbnail');
[/php]

app.phpへの設定

[php]
define('SITE_URL', 'http://store-e-broad.localhost/');
[/php]

[php]
<?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;
}
}
[/php]

ビュー内での記述

[php]
$thumb = $appThumbnail->resizeImg('path/to/sample.jpg', 100, 50, true);
echo $html->image('/'.$thumb['path'], aa('alt',''));
[/php]

ビュー内の表記で、絶対パスにする場合は最初に「/」を連結させてください。

(4) ImageThumbnailer

ImageThumbnailer powered by GoogleAppEngine for Java
http://imgthum.appspot.com/

最後に、サムネイルを作成してくれ、1日キャッシュしてくれるサービス。
自力で作成することなく、リンクすれば作ってくれるという有り難いサービスとなっております。

このサイトは、URLの末端に画像へのURLを指定することによって縦横最大400pxのサムネイル画像を直接出力するGoogleAppEngineを利用したクラウドサービスです。出力されるサムネイルはPNG形式で出力されます。
出力するサムネイルの大きさを指定することも可能です。指定しない場合は100px * 100pxのサムネイルを生成します。
生成されたサムネイルは、1日の間キャッシュされます。

使い方

ということで、横サイズを100pxとする場合のサンプルは以下の様に指定。

[html]
<img src="http://imgthum.appspot.com/100/http://example.com/img/image.jpg" alt="" />
[/html]

以上です。

-PHP
-,