PHP と GD ライブラリを使用して、独自のカスタム スパイダー チャート ジェネレーターを作成しました。基本的に、ユーザーは一連の質問に回答し、質問への回答に基づいてスパイダー チャートが生成されます。
全体として、すべてがうまく機能します。生成されたグラフは数学的に正確で (ただし、クイズは完全に言い換える必要があります)、十分に迅速に機能するようです。ただし、Firefox (Snowleopard ではバージョン 15.0.1) から画像を保存しようとすると、画像自体を開くことができないことに気付きました。他のブラウザーから画像を保存すると、任意の画像エディターで開くことができる作業画像が生成されます。
私が特に興味深いと思うのは、いつ壊れるかです。これを正確に説明できるかどうかを確認します。
完全に機能するバージョンは [もうここにはありません ] です。チャート自体の処理と生成に関連するすべてのコードは次のとおりです。
chart.php (POST データの処理)
$r = 300; //Radius
//Processing of information passed from the previous form yields an array $cargs
//$cargs contains key value pairs. Values are of type float with a range 0-$r
$chart = new Chart($r); //Generates Canvas and Circle
$chart->generate($cargs); //Generates Polygon based on $cargs
header("Content-type: image/png");
imagesavealpha($chart->image, true);
imagepng($chart->image);
imagedestroy($chart->image);
?>
SS_Chart.php (チャート オブジェクト)
class Chart
{
public $radius;
public $diameter;
public $image;
private $_labels;
private $_values;
private $_n;
public function Chart($r=300)
{
$this->radius = $r;
$this->diameter = 2*$r;
$this->image = $this->_get_transparent_canvas($this->diameter, $this->diameter);
$this->_draw_circle();
}
public function generate($arr)
{
if(count($arr)>2)
{
$red = imagecolorallocate($this->image, 255, 0, 0);
$this->_n = count($arr);
$this->_labels = array_keys($arr);
$this->_values = array_values($arr);
$coors = array();
for($i=0;$i<$this->_n;$i++)
{
//Generate coordinates....
}
imagefilledpolygon($this->image, $coors, $this->_n, $red);
}
else
trigger_error('Number of $key=>$value pairs in arguments must be 3 or greater', E_USER_ERROR);
}
private function _get_transparent_canvas($w, $h)
{
$canvas = imagecreatetruecolor($w, $h);
imagealphablending($canvas, true);
$transparent = imagecolorallocatealpha($canvas, 0, 0, 0, 127);
imagefill($canvas, 0, 0, $transparent);
return $canvas;
}
private function _draw_circle()
{
$white = imagecolorallocate($this->image, 255, 255, 255);
imagearc($this->image, $this->radius, $this->radius, $this->diameter, $this->diameter, 0, 360, $white);
}
}
ここが興味深いところ$chart->generate($cargs);
です。chart.php でコメントアウトすると、Firefox は寸法に応じて機能し、編集可能な透明な png と白い円を生成します。
ただし、public function generate
SS_Chart.php 内のすべてをコメントアウトし、コメントを外したままにしておくと$chart->generate($cargs);
(基本的に実行されるメソッドになりますが、実際には何もしません)、結果の png を開くことができなくなります。
そんなことがあるものか??
この問題については、Firefox を GD ライブラリと連携させる際のいくつかの問題について説明している奇妙なフォーラムを除けば、あまり見つけていませんが、このような問題に遭遇したのはこれが初めてです。
- それが私のコードの問題である場合、その問題はすべてのブラウザーで蔓延しているのではないでしょうか?
- これはスコーピングや、主な GD 機能がオブジェクト内で利用されているという事実と関係がありますか?
- また、この問題は他の人にも起こりますか?
- 以前にこのような問題に遭遇した人はいますか?
- これは既知の問題ですか?
これは実際には、実際の「問題」というよりは好奇心ですが、この問題についての洞察をいただければ幸いです。