グラフ描画ももはやAPIでOK

数年前まではPHPでグラフを描画させようと思うと相応の苦労が必要だった。自前で美しいグラフを描かせるのにはかなりのステップ数のプログラムを書かなくてはいけない。必然的に先駆者のお知恵拝借でライブラリをさがすことになる。その次に日本語化。日本語フォントファイルをIPAあたりからダウンロードしてきて試行錯誤してみたり・・・。

最近、グラフを描かせる必要性に迫られてウェブで検索していると、もはやRESTで呼び出すだけでグラフを描画してくれるサービスがあることに驚いた。

Google Chart API

RESTで呼ぶだけだから、プログラムの必要性もない。パラメータは引数で渡すだけ。しかも日本語も通る。2年ほど前から公開が始まっていたっぽい。グラフの種類も10種類くらいあるし、QRコードの作成までOK(これでQRコードのプログラムさえ必要なくなる)。見栄えも相応に美しいし文句のつけようもない。

こうしてみていると、かつて「ウェブ上で実現するのが難しく相応の技量が必要だったこと」ということが、誰でも間単にできてしまうようになってきた。敷居を下げるという意味では大変有意義なことではあるが、当然試行錯誤することがなくなるわけで、それだけプログラムの技量を磨く機会を失いつつあるということに少し危機感を感じる。

15年も前だとウェブプログラミングが一般的でなかったし、フレームワークもなかったし、わかりやすい書籍もほとんどなかった。何でも一から書かないといけなかった。今から思えば試行錯誤の連続だった。状況は急転している。今でも生まれつき優秀なプログラマはたくさんいるだろうけど、そういう人はいつの時代に生まれてもやっぱり優秀なんだろう。でも自分のような普通のプログラマは、相応に学習する機会に恵まれないと(嫌でもやらざるを得ない状況に追い込まれないと)、そこそこのプログラマにたどり着けないような気がしてならない。まさしく両極化だ。

いいライブラリに出会えたけど、考え事も増えそうだ。

画像を作って日本語文字列を表示

画像を操作する関数としてGD関数群が用意されている。で、それらの関数を使うと、拡大とか縮小とかトリミングとかいろいろできる。さらに画像の中に文字を書き込むこともできる。でもって、さらに、マルチバイトな文字も書き込むことができる。それがimagettftext関数だ。

imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )

ただし、一手間かけないといけない。7つ目の引数「フォントファイル」の指定だ。たいていの場合、レンタルサーバにはそんなものは用意されていないので、自前で準備する必要がある。で、使えるフォントはこちらのがいいようです。

M+とIPAフォントの合成フォント

請求書フォームとかPDF出力したりするのにもつかえそう。

Image_Graphを使ってみる

2007/05/15 | 画像ツール

さっそくImage_Graphを使ってみる。
こちらは安定版がでておらず、まだアルファ版段階。
またImage_GraphはImage_Canvasに依存している(こちらもおそらくアルファ版)。しかしアルファ版のせいかどうかわからないが・・・なんとなく明瞭でない(依存はしているのだがインストール時の整合性が取れていないのかもしれない)。何はともあれインストール。
これで使えればいいのだが次にフォントの問題。日本語フォントを使わなくてもエラーが続出する。フォントを正しく指定しておくことが必要なようだ。
○フォントをインストールしておく
○設定ファイルにインストールしたフォントを登録する

ここでまた問題。フォントをインストールするディレクトリは指定できるのだが、設定ファイルをどこに設置するかは指定できない。つまりPearでImage_Canvasをインストールしたディレクトリ内の所定のファイルを編集しなくてはいけないのだ。つまりroot権限が必要(もしくはなんらかの代替処置が必要)。実際に作業した内容は以下のようになる。
(1) (Pear Directory)/Image/Canvas/Fonts/fontmap.txtを修正
 使用するフォントを登録する(記述方法はファイルを見れば簡単)。
(2) フォント格納用ディレクトリを作って、そこにフォントをインストール。
 PHPlotと同様のフォントで問題ないです。
(3) プログラム記述時、以下のように記述する。
 define(‘IMAGE_CANVAS_SYSTEM_FONT_PATH’,’(フォントのディレクトリ)’);
 require_once(‘Image/Graph.php’);
 requireする前にdefineしておく必要あり。

グラフの記述方法はサンプルを参考にするしかない。まだドキュメントが準備されていないからだ。もちろんソースを読めばわかるとは思うが、このライブラリ、かなり面倒。少し努力したが一瞬にして萎えてしまった。ということで、相当の強者でないと使うのは大変だろう。
かなり強力なツールではあると思うのだが、残念。ドキュメントの充実を期待する限りだ(どうもコミットしようという気になれない・・・)。

グラフの描画「PHPlot」(再)

2007/05/14 | 画像ツール

久しぶりにグラフを書かせる機会を得た。
ブログの過去記事をみたら、2件存在。「PHPlot」と「GraPHPite」だ。ちなみにGraPHPiteは現在Pearにとりこまれて「Image_Graph」というライブラリになっている。
過去記事「グラフツールphplot
過去記事「PHPによるグラフ描画ツール

まずPHPlotを使ってみた。
これは非常にわかりやすくて使いやすかった。書いたスクリプトはこんな感じ。

(1) $graph=new PHPlot(700,500);
(2) $graph->SetDataType(“text-data”);
(3) $graph->setDataValues($graphData);
(4) $graph->SetPlotType(“bars”);
(5) $graph->SetXTickIncrement(1);
(6) $graph->SetYTickIncrement(1);
(7) $graph->SetLegend($tmpLegend);
(8) $graph->DrawGraph();

(1)でグラフ画像のサイズを指定して初期化し、(2)でデータの種類を指定、(3)であらかじめ用意したデータをセットし、(4)でグラフの種類を指定、(5)(6)でメモリ幅を指定、(7)で凡例を指定、そして(8)で出力。
ただそのままでは日本語が通らなかった。setUseTTFなんて感じで使えそうなメソッドがあって、いくつか試してみたけどうまく動いてくれなかった。仕方がないので、

require_once(LIB_DIR . ‘phplot/phplot.php’);
class extPHPlot extends PHPlot {
var $use_ttf = TRUE;
var $ttf_path = ‘(Path to TTF Directory)';
var $default_ttfont = ‘(TTF Name)';
}

みたいな感じでクラスを拡張し、これを使用した。もちろん上記の$ttf_pathと$default_ttffontには別途用意したTTF(TrueType Font)のパスとファイル名を指定する。これは以下のところからダウンロードして使えばいいだろう。
http://sourceforge.jp/projects/efont/

簡単ではあるのだが、どうもグラフの種類が少ないようだ。とりあえず棒グラフを作ってみたけれど、X軸とY軸を入れ替えたものとかできないっぽい。見栄えもそれほどいいとはいえない。
とりあえずImage_Graphも試してみることにする。

画像のサムネイルを作成

2006/07/19 | 画像ツール

このブログ、「画像 サムネイル」なんてキーワードで検索する人も多いようだ。で、たまたま画像のサムネイル生成のルーチンを作ったのでのっけておく。

<?php
$filePath=’test.jpg';
list($imW,$imH)=getimagesize($filePath);
//サムネイルの長辺の長さ
$thumbnail=400;
if($imW > $imH){
$newW=$thumbnail +1;
$newH=round($imH * ($thumbnail +1) / $imW);
}else{
$newH=$thumbnail +1;
$newW=round($imH * ($thumbnail +1) / $imH);
}

$imOld=imagecreatefromjpeg($filePath);
$imTmp=imagecreatetruecolor($newW,$newH);
imagealphablending($imTmp, false);
imagecopyresized($imTmp,$imOld,0,0,0,0,$newW,$newH,$imW,$imH);

$imNew=imagecreatetruecolor($newW -1,$newH -1);
imagealphablending($imNew, false);
imagecopyresized($imNew,$imTmp,0,0,0,0,$newW -1,$newH -1,$newW -1,$newH -1);

imagejpeg($imNew);
exit();
?>

いったん画像を縮小して、それから端を1ピクセルカットしている。縮小時に四捨五入とかする関係で、端数の分、端に黒背景がでるので、それをカットしてる。とりあえずいい感じ。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net