[PHP] GDって便利ですねぇ…

存在は知ってたんだけど、仕事のサーバでのPHPのコンパイルが上手くいかなかったこともあって、
実際には使っていなかった、GD。
でもまぁよくよく考えたら、コンパイルでこけてたのはFreeType(日本語関連)だったので
別に画像の処理に関しては問題ないでしょ、ということでやってみた。
そもそも、NOBODY:PLACEはレンタルサーバだし、
その辺のインストールは問題ないわけだからね(多分)

基本的には、
1) 画像をデータとして読み込む
2) 画像データを加工
3) 保存するための新しい画像データを作成
4) 加工済みデータをそこへ放り込む
5) 出力
という認識でよいかと。
出力先がブラウザなら、アクセスの度に表示するプログラムになるし、
ファイルなら、サムネイルを作成するプログラムになる、と。
(この辺の関数に関しては、マニュアルの『XLI. イメージ関数(image)』に詳しいです)

追記に、このサイトで実際使ってる、(かなりいい加減な)プログラムを載せておきました。
幅・高さを検討しているところと、画像の形式によって使う関数を振り分ける処理が入ってますが、
まぁ、基本的には大したことやってません。
決められた幅(または高さ)まで画像を縮小するだけですな。

ちなみに仕事でこれをどう応用したかというと、
本来の目的の前の試験段階として、携帯でジャケ写が見られるようにしてみました。
ジャケ写のファイルは全てjpegで、かつジャケ写によってはファイルサイズがまちまちなので、
今まで実装は不可能だと思ってきたんだけど…
GD使って処理してやれば簡単じゃん、ということに気づき。
しかし、なんだろう、加工済みの画像データ長を取得する関数が見つけられなくて、
本当は、ファイルサイズから縮小処理をしたかったんだけど無理なようで…
仕方無しに、現在は試験版として、幅で縮小処理してます。
(pngで出力するとやたら大きくなるのが気になるけど)

てか、気付きつつあるんだけど、これ使えば、画像連結用プログラム(gifcat.php)使わなくても
一つの画像としてカウンターを表示できるんじゃ無かろうか?
しかも文字でも出来るんじゃなかろうか?
そしてフォントも変えられるんでは。
うーむ。時間見つけてやってみます。

GD、便利。


長いけどmoblog Indexで使ってるソース転載。
さらっと作ったのでかなり適当。
本来ならこういうユースの場合、別ファイルに書き出してやる方がサーバには優しい、
ということを申し添えておきますです。
<?php
#===================================================================#
# 画像を任意のサイズに揃えて縮小加工                #
#                         Version: 1.00.00 #
#                       START: 2005/02/17(THU) #
#                   LAST MODIFIED: 2005/02/17(THU) #
#===================================================================#

if($_REQUEST[‘size’] != “”){$size = $_REQUEST[‘size’];}else{$size = 150;}
$uri = $_REQUEST[‘image’];

#—————————————————#
# 画像フォーマットの取得              #
#—————————————————#

if(preg_match(“/\.jpg$|\.jpeg$/”,$uri)){$format = “jpeg”;}    # JPEG
elseif(preg_match(“/\.gif$/”,$uri)){$format = “gif”;}      # GIF
elseif(preg_match(“/\.png$/”,$uri)){$format = “png”;}      # PNG

#—————————————————#
# ファイルから新規画像を作成(フォーマット毎)    #
#—————————————————#

$path = preg_replace(“/%2F/”,”/”,$uri);
$path = preg_replace(“/http:\/\/www.nobodyplace.com\//”,”/home/nobodyplace/www/”,$path);
if($format == “jpeg”){
  $image = imageCreateFromJpeg($path);
}elseif($format == “gif”){
  $image = imageCreateFromGif($path);
}elseif($format == “png”){
  $image = imageCreateFromPng($path);
}

#—————————————————#
# 元画像の幅・高さを取得              #
#—————————————————#

$oldWidth = imageSX($image);        
$oldHeight = imageSY($image);

#—————————————————#
# 新しい幅・高さを計算                #
#—————————————————#

if($oldWidth > $oldHeight){
  $newWidth = $size;
  $newHeight = ($size * $oldHeight / $oldWidth);
}else{
  $newWidth = ($size * $oldWidth / $oldHeight);
  $newHeight = $size;
}

#—————————————————#
# 新画像の作成                    #
#—————————————————#

$imageNew = ImageCreateTrueColor($newWidth, $newHeight);
imageCopyResampled($imageNew, $image, 0, 0, 0, 0, $newWidth, $newHeight, $oldWidth, $oldHeight);

#—————————————————#
# 画像の書き出し(フォーマット毎)          #
#—————————————————#

header(“Content-Type: image/$format”);
if($format == “jpeg”){
  imagejpeg($imageNew);
}elseif($format == “gif”){
  imagegif($imageNew);
}elseif($format == “png”){
  imagepng($imageNew);
}
?>