PHPプロ!TIPSメーリングリスト

┏┏┏―― PHPプロ!Tipsメーリングリスト――――――――――――――
┏┏    
http://www.phppro.jp/ 2007/6/22 号

―――――――――――――――――――――――――――――――――

こんにちは、アシアルの中川です。
アシアルでは先週、社員の約半数がシリコンバレー研修にいっており、
かなりさびしい状態のオフィスとなっていました。
研修を終えシリコンバレーから戻ってきたメンバーは、本場の刺激を味わった
り、貴重な体験ができ満足感たっぷりの様子でした。
研修については、アシアルぶろぐのほうにもっと詳しく載せていますので是非ご
覧ください。
この「PHPプロ!TIPSメーリングリスト」も少しでも皆さんの刺激となるような
内容をお届けできればと思っております。

それでは、第43回TIPSメーリングリストをお楽しみ下さい。

━ 目次 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 1. JpGpraphで3D円グラフをきれいに表示させる方法
 2. PEAR::Image_Puzzleを使ってみよう
 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. JpGpraphで3D円グラフをきれいに表示させる方法

PHPでグラフを作成する場合によく使われるJpGraphというライブラリがあります。
JpGraphは教育などの非営利目的では無料で使えますので、PHPでのグラフ作成ではよく紹介されたりしています。

しかし、このJpGraphで、3D円グラフを作成した場合、あまりきれいなグラフを作ってくれません。
管理画面等での使用には問題ないかもしれませんが、一般に公開されるようなグラフの場合、デフォルトの3D円グラフではちょっと気になります。

今回はJpGpraphで3D円グラフをきれいに表示させる方法を紹介します。

JpGraphの設置・設定方法等については、http://www.asial.co.jp/jpgraphを参考にしてください。

下記サンプルコードでは長々と書いてありますが、きれいに見せる為にやっていることは以下のことだけです。

  1. 3D円グラフを作成予定のサイズよりかなり大きなサイズで作成する
  2. 大きなサイズで作成したグラフをGDで縮小して表示する

実はこれだけでデフォルトと比べるとかなりきれいなグラフが作成できます。
以下、簡単なサンプルです。

※このサンプルでは違いを比べやすいように、GETクエリにr=1を指定するとリサイズするようにしてあります。

<?php

$RESIZE_SCALE 
4;  //memory_limit設定と相談。
$demo_data array(7455494537 );    //適当なデータを作成

$GRAPH_SIZE array('width' => 300'height' => 200'fontsize' => 10,
'margin' => 5);
$BIG_GRAPH_SIZE $GRAPH_SIZE;

//クエリにr=1を指定した場合にリサイズする
if (isset($_GET["r"]) && $_GET["r"] == 1) {
    foreach (
$BIG_GRAPH_SIZE as $_key => $_val) {
        
$BIG_GRAPH_SIZE[$_key] *= $RESIZE_SCALE;
    }
}

/**
 * グラフを作成する
 */
include_once ("/path/to/jpgraph.php");
include_once (
"/path/to/jpgraph_pie.php");
include_once (
"/path/to/jpgraph_pie3d.php");

$pie = new PiePlot3D($demo_data);
$pie->SetSize(0.5);
$pie->SetStartAngle(90);
$pie->setAngle(50);
$pie->value->SetFont(FF_GOTHICFS_NORMAL$BIG_GRAPH_SIZE["fontsize"]);
$pie->value->SetMargin($BIG_GRAPH_SIZE["margin"]);

$graph = new PieGraph($BIG_GRAPH_SIZE["width"],
$BIG_GRAPH_SIZE['height'], 'auto');
$graph->SetFrame(false);
$graph->img->SetImgFormat('png');
$graph->img->SetExpired(false);
$graph->Add($pie);

$file_path "./demo_img/" time() . ".png"//今回は適当なファイル名で保存
$graph->Stroke($file_path);
$source imagecreatefrompng($file_path);

//クエリにr=1を指定した場合にリサイズする
if (isset($_GET["r"]) && $_GET["r"] == 1) {
    
$output imagecreatetruecolor($GRAPH_SIZE['width'],
$GRAPH_SIZE['height']);
    
imagecopyresampled(  $output$source0000
                       
$GRAPH_SIZE['width']    , $GRAPH_SIZE['height']
                       , 
$BIG_GRAPH_SIZE['width'], $BIG_GRAPH_SIZE['height']
                      );
} else {
    
$output $source;
}

header("Content-Type: image/png");
imagepng($output);
exit;

?>

※デフォルト

デフォルト

※変更後

変更後

このように、デフォルトのものと比べても、かなり3Dの円のラインがきれいに表示されます。

実際の運用時には大きな画像を作るのは非常に負荷が高くなりますので、うまくキャッシュを使うようにすると良いでしょう。

2. PEAR::Image_Puzzleを使ってみよう

今回はPEARのライブラリ郡の中でも、需要があるのか無いのか分からないマイナーなライブラリを紹介してみたいと思います。

今回紹介するのはPEAR::Image_Puzzleです。
これは指定した画像を分割し、ジグソーパズルのピースのような形をした画像を作成してくれるライブラリです。

それぞれピースのつなぎ目部分も、市販されているジグソーパズルのような形に成型してくれる、なかなか凝ったライブラリなのですが、これはいったい誰が使うんでしょうか。

まずはインストールです。

PEAR::Image_PuzzleはPEAR::Image_Color2に依存しているため、まずはこちらからインストールします。

PEAR::Image_Color2はまだアルファ版なので、パッケージ名の後ろに「-alpha」を付け、以下のコマンドでインストールを行います。

pear install Image_Color2-alpha

このインストールが完了した後、PEAR::Image_Puzzleのインストールを行います。
こちらはベータ版なので以下のコマンドを実行します。

pear install Image_Puzzle-beta

これでインストールは完了です。

それでは早速使ってみましょう。

まずはパズルのピースに分割したい画像を一つ用意します。
ここではその画像を original.gif としておきます。

この画像からピースの画像を作成するには以下のようなスクリプトを使用します。

<?php
include_once("Image/Puzzle.php");

$options array(
  
'cols' => 4,
  
'rows' => 4,
  
'edge' => 'default'
);

$puzzle = new Image_Puzzle($options);
$puzzle->createFromFile('original.gif');
$puzzle->saveAll('piece_[row]_[col].gif');

?>

あとはこのスクリプトをPHPコマンドで実行するだけです。。
これで同一ディレクトリ上に "original.gif" を4×4に分割したピース画像が生成されます。

それぞれの画像ファイル名は、"piece_[row]_[col].gif" の[row]と[col]が列と行の数値に置き換わった名前になります。

'edge'はピースとピースのつなぎ目の形を指定するオプションで、arc, halfcircle, line, sinusなど、いくつか種類が用意されていますが、一般的なピースの形にしたいのであれば「default」のままで構いません。

実際に作成した画像ファイルは以下のようになります。

おおもとの画像

おおもとの画像

ピース画像(まとめました)

ピース画像(まとめました)

※実際に生成された全ピース画像(.zip)

パズルゲームが作りたくて作りたくて仕方ない!という方はぜひこれを利用してみてください。