ImageMagick+GDでプレビュー作成

JPG、GIFFはもちろん、EPSやPSD、TIFFからもプレビューを作成します。

GDではTIFFやEPSが扱えないため、ImageMagickを利用していますが、CMYKの変換はGDの方がましなので、CMYKの場合のみGDに渡して出力します。
要ImageMagic&Imagick&GD
V2に更新しました。2012/11/12

変更点
  • サーバ負荷軽減のため、一度読み込んだ事のある画像はキャッシュファイルを読み込むようにしました。

pa_thumbnail.php

<?php
//
// +----------------------------------------------------------------------+
//pa_thumbnail
// +----------------------------------------------------------------------+
//@package pa_thumbnailV.2(beta) 2012/11/12
//@author Studio PhotoArtisan
//@copyright 2012 Studio PhotoArtisan
//
//初期設定
$foldername = 'thumbnails/';//キャッシュファイル保存先フォルダ名
$SaveImage = TRUE;//キャッシュファイルを保存しない場合はFALSEに変更
$MaxImageSize = 600;//サムネイル画像の最大サイズ
$quality = 70;//jpg画質
$folder = dirname(__FILE__) . '/' . $foldername;
$src = $_GET['src'];
$size = $_GET['size'];
$filename = str_replace('.', '_', str_replace('/', '_', str_replace('http://', '', $src))) . '_' . $size . '.jpg';//ファイル名設定
$filename = substr($filename, -100);//念のため文字数を100文字に制限
$path = $folder . $filename;
if (!file_exists($folder)) {//キャッシュフォルダの存在チェック
mkdir($folder, 0777);//キャッシュフォルダを作成
}
if ($size > $MaxImageSize) {
$size = $MaxImageSize;//最大画像サイズに固定
}
$image = new Imagick();
if ($_GET['cache'] != 'no' && file_exists($path)) {//cache=noを渡すとキャッシュファイルを読み込みません
$image -> readImage($path);//キャッシュファイルを読み込み
header('Content-type: image/jpeg');
echo $image;//イメージ出力
} else {//キャッシュファイルが無いまたは読み込まない場合
$image -> readImage($src);//元ファイルを読み込み
$image -> setImageOpacity(1.0);//透過画像対策
$image -> flattenImages();//レイヤー対策
$image -> thumbnailImage($size, $size, true);//サイズ変更
$image -> setImageFormat('jpg');//jpgに変換
$image ->setImageCompression(Imagick::COMPRESSION_JPEG); //圧縮方式を指定
//$image -> setCompressionQuality($quality);//画質を設定(PHP5.1.6以前?)
$image -> setImageCompressionQuality($quality);//画質を設定(PHP5.1.6以降?)
$cs = $image -> getImageColorspace();//カラースペースを取得
if ($SaveImage == TRUE or $cs == Imagick::COLORSPACE_CMYK) {
$image -> writeImage($path);//キャッシュファイルを作成
}
if ($cs == Imagick::COLORSPACE_CMYK)//CMYKの場合
{
$gdimage = ImageCreateFromJPEG($path);//GDで読み込み
unlink($path);//キャッシュファイルを削除
ImageJPEG($gdimage);//GDで表示(GD内で自動的にRGBに変換)
if ($SaveImage == TRUE) {
ImageJPEG($gdimage, $path, $quality);//キャッシュを保存
}
imagedestroy($gdimage);//メモリ開放
}
//CMYK以外
else{
header('Content-type: image/jpeg');
echo $image;//イメージ出力
}
}
imagick_destroyhandle($image);//メモリ開放
?>

html

<img src="pa_thumbnail.php?src=画像url&size=サムネイル長辺ピクセル数" />

imgタグでpa_thumbnail.phpに画像URLとサイズを渡すと、サムネイルを生成し表示します。
画像URLは絶対パスか、設置URLからの相対パスで指定して下さい。
cache=noを渡すとキャッシュファイルを読み込みません。

どうもsetCompressionQuality()が効いていないようです。
いずれまた検証します。

ImagickのsetCompressionQualityが効かない場合はsetImageCompressionQualityを使うようにと、マニュアルに書いてありました。
ちゃんと読まないとだめですね。


動作サンプル
画像URL
サムネイルサイズ

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

カレンダー

2011年2月
« 1月   4月 »
 123456
78910111213
14151617181920
21222324252627
28