PHPメモ:画像出力(グラフィックカウンター)

謎猫
グラフィックカウンタを作り終わってたよー

フィロ
過去形!?

謎猫
あー設置とかするのにデータベースを追加作成する必要があったから後回しにしてましたー


まず今回の説明での注意事項:
.哀薀侫ックカウンターということでHTMLのIMGタグからPHPを読み出せるが、結局サーバーで処理を行うので、PHPに対応したサーバーにPHPファイルを設置しないと動作しません。
△泙PHPにGDライブラリが入っていない場合も動作しません。
 GDライブラリが使えるかは、取り敢えずphpinfo()で確認を。

謎猫
さてさてー
今回は使いやすいようにHTMLのIMGタグからPHPを読み出せるものに挑戦したのであるー

フィロ
…と言いますと…?

謎猫
まぁ言うならPHPを直接書けないブログにも設置できるって事ー
ほらブログとかにあるカウンタのHTMLソースを見るとGIFとかJPEGじゃなくてPHPとかCGIの拡張子になってる事があるじゃんー
あれはサーバにアクセスして画像を取得してるんだよー

フィロ
そういう仕組みだったんですね…。
…気にした事もなかったです。

謎猫
まー熊にそんなこと期待してもしょうがないかー
とりあえずコードを公開ー


//出力画像形式をgifに指定
header("Content-type:image/gif");
//画像0.gifを読み込み
$img = ImageCreateFromGif("0.gif");
//画像PNG形式で出力
ImageGif($img);
//画像用メモリ開放
ImageDestroy($img);
//プログラム終了(誤動作防止)
exit;

フィロ
これだけで画像が表示できるんですか?

謎猫
これだけだと表示するだけって感じだけどねー
ちなみにpngと書いてある部分をgifやjpegに書き換えればそっちの形式で出力するので試してねー

フィロ
でも…これだと画像1つしか表示できないのではにですか?
カウンタだと5桁くらいは最低限必要ですよね?

謎猫
おーフィロくん気付いたかー
確かにこのままでは1つしか表示しか出力しないっすー
これを解決するにはIMGタグを桁数だけ書くかー
もしくは複数の画像を合成するかだねー

フィロ
画像の合成…?
PHPってそんなこともできるんですね。
…コードを見てみましょうか。



//数値成形(6桁を0埋め)
$cnt = 1500;
//「1500」を「01500」に成形
$cnt2 = sprintf("%06d", $cnt);

//画像形式指定
header("Content-type:image/gif");

//桁数だけループ
for($i=0; $i<mb_strlen($cnt2); $i++){
	$strNum = substr($cnt2,$i,1);
	//画像ファイル名を指定
	$imgUrl[$i] = $strNum.".gif";
	//画像読み込み
	$img[$i]=imagecreatefromgif($imgUrl[$i]);
	//画像の大きさを取得
	list($w[$i], $h[$i]) = getimagesize($imgUrl[$i]);
}

//新規画像作成
$image=imagecreate($w[0]*mb_strlen($cnt2), $h[0]);
//作成した画像の黒色部分(初期色)を透明化
$imgClr = imagecolorallocate($image,0x00,0x00,0x00);
imagecolortransparent($image,$imgClr);

//桁数だけループ
for($i=0; $i<mb_strlen($cnt2); $i++){
 //画像合成(コピー先、コピー元、先x、先y、元x、元y、元width、元height、pct)
 imagecopymerge($image,$img[$i],$w[0]*$i-1,0,0,0,$w[$i],$h[0],100);
}

//画像出力
imagegif($image);

//画像用メモリ開放
for($i=0; $i<mb_strlen($cnt2); $i++){
	imagedestroy($img[$i]);
}
imagedestroy($image);

//プログラム終了(誤動作防止)
exit;

フィロ
…長くなりましたね。

謎猫
あー長いんで説明は割愛って事でー
コード内のコメントで理解して下さいー

フィロ
こらこら。

謎猫
まぁ大事なのはimagecopymerge()だねー
これで2つの画像を合成するのであるー
3つめからは合成した画像に更に合成していくって感じー
詳しい使い方はPHPのオンラインマニュアルを見ようねー
ではまたー!!

フィロ
うわ逃げた!


ごめんなさい説明力尽きました。
あまり綺麗なコードではないがこれで一応動きます。動いてます。

やっぱり説明は苦手だなあ…


コメント
コメントする








    
この記事のトラックバックURL
トラックバック