我使用 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 函数在对象中使用的事实有更多关系?
- 此外,这个问题是否会发生在其他人身上?
- 有没有人遇到过这样的问题?
- 这甚至是一个已知问题吗?
这实际上更像是一个好奇心,而不是一个真正的“问题”,但任何对此事的洞察力将不胜感激。