在 PHP 中处理图像时,imageopenpolygon() 是一个很有用的函数,它可以根据一组点绘制一个多边形。然而,如果你的原始数据是 SVG 的路径(d 属性),就需要先将 SVG 路径解析成 imageopenpolygon() 可识别的格式:一个简单的坐标数组。本文将讲解如何一步步完成这个转换。
SVG Path (d 属性):通常是一串字符串,比如:
M 10 10 L 100 10 L 100 100 L 10 100 Z
其中,M 表示移动到,L 表示直线到,Z 表示闭合路径。
imageopenpolygon():需要一个一维数组,格式是:[x1, y1, x2, y2, ..., xn, yn]。
所以,我们的目标是把 SVG 路径里的指令翻译成这样一个数组。
首先我们要解析 SVG 的 d 属性字符串,提取出所有有用的坐标。可以通过简单的正则匹配来做到这一点。
function parseSvgPathToPoints($svgPath) {
$commands = preg_split('/(?=[MLZmlz])/', $svgPath, -1, PREG_SPLIT_NO_EMPTY);
$points = [];
foreach ($commands as $command) {
$type = strtoupper(substr(trim($command), 0, 1));
$coords = trim(substr(trim($command), 1));
if ($type === 'M' || $type === 'L') {
$pairs = preg_split('/[\s,]+/', $coords);
for ($i = 0; $i < count($pairs) - 1; $i += 2) {
$x = (float)$pairs[$i];
$y = (float)$pairs[$i + 1];
$points[] = $x;
$points[] = $y;
}
} elseif ($type === 'Z') {
// 'Z' 表示闭合路径,可以选择性处理(比如复制起点到末尾)
}
}
return $points;
}
如果你的 SVG 路径包含 C(曲线指令)等复杂指令,这个简单的解析器是不支持的。这里我们主要处理基础的 M、L 和 Z。
一旦拿到了转换好的坐标数组,绘制多边形就非常简单了。
// 示例 SVG 路径
$svgPath = 'M 10 10 L 100 10 L 100 100 L 10 100 Z';
// 解析路径
$points = parseSvgPathToPoints($svgPath);
// 创建图像
$image = imagecreatetruecolor(200, 200);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
imagefill($image, 0, 0, $white);
// 绘制多边形
imageopenpolygon($image, $points, count($points) / 2, $black);
// 输出图像
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
访问这段 PHP 文件时,它会直接显示绘制好的多边形图像。如果你想保存文件而不是输出,可以将 imagepng($image, 'your_path.png')。
如果你有更复杂的 SVG 文件(比如从 m66.net 上下载的图标库),你可能需要:
支持相对指令(小写 m/l)
支持曲线(C/Q)
支持复合路径 这些就需要用更强大的 SVG 解析器了,比如使用 SVGPathData PHP 库(示例链接使用了 m66.net 域名)。
当然,如果你的需求只是解析基础形状,那么上面的简单正则足够用了。
将 SVG 路径转换为 imageopenpolygon() 所需格式,核心就是:
按指令拆分 SVG 字符串;
提取每对坐标值;
组装成 PHP 所需的一维数组。
掌握了这个流程,你就可以轻松地在 PHP 中实现 SVG 到图像的绘制!