Home > PHP

phpとimagickでサムネイルを作成

サムネイル作成などの画像操作にはimagickという拡張モジュールみたいなものを使うと便利です。紛らわしいのですが、ImageMagickは端末操作やPerlなどで使用できますが、phpの場合はimagickというモジュールを別途必要とします。あらかじめimagickとそれに依存するパッケージのインストールをしておく必要があります。

サムネイルを作成

<?
$image = new Imagick('image.jpg'); //Imagickのインスタンスの作成
$image->resizeImage(100, 0, imagick::FILTER_MITCHELL, 1); //アスペクト比を保ちながら縮小(リサイズ)
$image->writeImage('001.jpg'); //指定のファイル名で保存
$image->destroy(); //メモリから消去
?>

最もシンプルに作成するには、上記のような感じになります。もしアスペクト比を無視してサムネイル作成する場合は、

$image->resizeImage(200, 100, imagick::FILTER_MITCHELL, 1, false);

となります。サイズの引数に0を与え、最後の引数に1を指定するとアスペクト比を保つようになり、サイズの引数を縦横共に指定し最後の引数にfalseを与えるとアスペクト比を無視して指定のサイズに整形されます。
 またすばらしことに$image->writeImage('001.jpg');の保存ファイル名の拡張子を.gifやpngにするだけでフォーマット変換してくれる優れものです。$image->writeImage('001.gif');にするだけでよいです。

サムネイルを一つ作成する(関数)

<?

$return = make_thumbnail("image.jpg","100","0","thumbnail.jpg");

function make_thumbnail ($file_name, $x_size, $y_size, $thumnail_file_name) {
    #-----------------
    # サムネイルの作成
    #-----------------
    
    //【呼び出し方】
    // make_thmbnail (<元画像のファイル名>, <サムネイルのサイズ(横)>, <サムネイルのサイズ(縦)>, <保存サムネイルのファイル名>);
    // 【例】
    // $return = make_thmbnail("image.jpg","100","0","thumbnail.jpg");
    /*
    ・指定の画像のサムネイルを作成します。
    ・引数は4つで<元画像のファイル名>, <サムネイルのサイズ(横)>, <サムネイルのサイズ(縦)>, <保存サムネイルのファイル名>を
    ・それぞれこの順番で指定します。横サイズと縦サイズのどちらかを0にするとアスペクト比を保ったままリサイズします。
    ・サイズの両方を0にすることはできません。
    ・保存するファイル名を元画像と同名にすると上書きされますので、元画像がリサイズされます。
    */
    
    $image = new Imagick($file_name);
    $image->resizeImage($x_size, $y_size, imagick::FILTER_MITCHELL, 1);
    $image->writeImage($thumnail_file_name);
    $image->destroy();
    
    return;
}

?>


複数のサムネイルを一度に作る

<?
#------------------------
# サムネイル作成の設定項目
#------------------------
$image_dir = "test-photo"; //元画像のあるディレクトリ
$thumbnail_dir = "thumbnail_dir"; //サムネイル画像を保存するディレクトリ
$x_size = 130; //サムネイルの横サイズ
$y_size = 0; //サムネイルの縦サイズ

#---------------
# サムネイル作成
#---------------
$open_dir = $image_dir;
if ($dh = opendir($open_dir)) {
    while (($file = readdir($dh)) !== false) {
        if(!is_dir($file)){
            //print "$file\n";
            if (file_exists($thumbnail_dir."/thumbnail_".$file)) {//サムネイルが既に存在する時はスキップ
                continue;           
            } else {
                $return = make_thumbnail($image_dir.'/'.$file, $x_size, $y_size, $thumbnail_dir."/thumbnail_".$file);   
            }
        }
    }
}
closedir($dh);

# 同期をする場合
$open_dir = $thumbnail_dir;
if ($dh = opendir($open_dir)) {
    while (($file = readdir($dh)) !== false) {
        if(!is_dir($file)){
            //print "$file<br />";
            list($front, $tail) = explode("_",$file);
            if (file_exists($thumbnail_dir.'/'.$file) && !file_exists($image_dir.'/'.$tail)) {
                $rm_file = unlink($thumbnail_dir.'/'.$file);
            }
        }
    }
}
closedir($dh);

#------
# 表示
#------
$open_dir = $thumbnail_dir;
if ($dh = opendir($open_dir)) {
    while (($file = readdir($dh)) !== false) {
        if(!is_dir($file)){
            list($front, $tail) = explode("_",$file);
            print "<a href='".$image_dir.'/'.$tail."'><img src='".$thumbnail_dir.'/'.$file."' /></a><br />";
        }
    }
}
closedir($dh);


function make_thumbnail ($file_name, $x_size, $y_size, $thumnail_file_name) {
    #-----------------
    # サムネイルの作成
    #-----------------
   
    $image = new Imagick($file_name);
    $image->resizeImage($x_size, $y_size, imagick::FILTER_MITCHELL, 1);
    $image->writeImage($thumnail_file_name);
    $image->destroy();
   
    return;
}

?>






プロフィール



  • Name :: 山上オサム ♂(37)
  • Hobby :: 武術
  • Work :: Web Designer