如果需要尽可能兼容,我会生成一个SVG图像并将其渲染为PNG。对于这种只有很少点的图像来说,这并不像听起来那么慢。
这是一个非常快速、非常简单的示例。它假设您有可用的
ImageMagick扩展,但在紧急情况下,您可以将SVG转储到文件中,并
exec()
一个命令行工具,如
rsvg。显然,“正确”的答案涉及一些缓存方案来渲染图形。另外,请原谅我不是更多的SVG专家。
graph.svg.php:
<?php echo '<'; ?>?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="240" height="240"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<g transform="translate(120,120) translate(0,15)">
<polygon fill="none" stroke="green" stroke-width="10"
points="0,0 -50,68.82 50,68.82" />
<g transform="scale(<?php echo $fill['green']; ?>)">
<polygon fill="green" stroke="green" stroke-width="10"
points="0,0 -50,68.82 50,68.82" />
</g>
</g>
<g transform="translate(120,120) rotate(72) translate(0,15)">
<polygon fill="none" stroke="red" stroke-width="10"
points="0,0 -50,68.82 50,68.82" />
<g transform="scale(<?php echo $fill['red']; ?>)">
<polygon fill="red" stroke="red" stroke-width="10"
points="0,0 -50,68.82 50,68.82" />
</g>
</g>
<g transform="translate(120,120) rotate(144) translate(0,15)">
<polygon fill="none" stroke="yellow" stroke-width="10"
points="0,0 -50,68.82 50,68.82" />
<g transform="scale(<?php echo $fill['yellow']; ?>)">
<polygon fill="yellow" stroke="yellow" stroke-width="10"
points="0,0 -50,68.82 50,68.82" />
</g>
</g>
<g transform="translate(120,120) rotate(216) translate(0,15)">
<polygon fill="none" stroke="purple" stroke-width="10"
points="0,0 -50,68.82 50,68.82" />
<g transform="scale(<?php echo $fill['purple']; ?>)">
<polygon fill="purple" stroke="purple" stroke-width="10"
points="0,0 -50,68.82 50,68.82" />
</g>
</g>
<g transform="translate(120,120) rotate(288) translate(0,15)">
<polygon fill="none" stroke="blue" stroke-width="10"
points="0,0 -50,68.82 50,68.82" />
<g transform="scale(<?php echo $fill['blue']; ?>)">
<polygon fill="blue" stroke="blue" stroke-width="10"
points="0,0 -50,68.82 50,68.82" />
</g>
</g>
</svg>
render.php:
<?php
$fill = array(
'green' => 0.5,
'red' => 0.8,
'yellow' => 0.55,
'purple' => 0.4,
'blue' => 0.75,
);
ob_start();
include('graph.svg.php');
$svg = ob_get_contents();
ob_end_clean();
$im = new Imagick();
$im->readImageBlob($svg);
$im->setImageFormat('png24');
$png = $im->getImagesBlob();
$im->clear();
$im->destroy();
header('Content-Type: image/png');
header('Content-Length: ' . strlen($png));
echo $png;
exit;
输出结果如下: