当前位置: 首页> 最新文章列表> 如何将 SVG 路径转换为 imageopenpolygon() 函数可识别的坐标数组?

如何将 SVG 路径转换为 imageopenpolygon() 函数可识别的坐标数组?

M66 2025-06-12

在 PHP 中处理图像时,imageopenpolygon() 是一个很有用的函数,它可以根据一组点绘制一个多边形。然而,如果你的原始数据是 SVG 的路径(d 属性),就需要先将 SVG 路径解析成 imageopenpolygon() 可识别的格式:一个简单的坐标数组。本文将讲解如何一步步完成这个转换。

理解 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 坐标

首先我们要解析 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(曲线指令)等复杂指令,这个简单的解析器是不支持的。这里我们主要处理基础的 MLZ

步骤二:使用 imageopenpolygon() 绘制

一旦拿到了转换好的坐标数组,绘制多边形就非常简单了。

// 示例 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() 所需格式,核心就是:

  1. 按指令拆分 SVG 字符串;

  2. 提取每对坐标值;

  3. 组装成 PHP 所需的一维数组。

掌握了这个流程,你就可以轻松地在 PHP 中实现 SVG 到图像的绘制!