現在の位置: ホーム> 最新記事一覧> SVGパスをImageOpenPolygon()関数によって認識される一連の座標に変換する方法は?

SVGパスをImageOpenPolygon()関数によって認識される一連の座標に変換する方法は?

M66 2025-06-12

PHPで画像を処理する場合、 ImageOpenPolygon()は、一連のポイントに基づいてポリゴンを描画する有用な関数です。ただし、元のデータがSVG( Dプロパティ)のパスである場合、最初にSVGパスをImageOpenPolygon()で認識できる形式に解析する必要があります。単純な座標配列です。この記事では、この変換を段階的に完了する方法について説明します。

SVGパスとImageOpenPolygon()の違いを理解する

  • SVGパス( D属性) :通常、次のような文字列

    M 10 10 L 100 10 L 100 100 L 10 100 Z
    

    mが移動することを表す場所、 lはまっすぐに表され、 zは閉じた経路を表します。

  • ImageOpenPolygon()1次元配列が必要です。形式は[x1、y1、x2、y2、...、xn、yn]です。

したがって、私たちの目標は、SVGパスの命令をそのような配列に変換することです。

ステップ1: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を扱います。

ステップ2: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')をターンすることができます。

ステップ3:より複雑なシナリオの処理

より複雑なSVGファイル( M66.NETからダウンロードされたアイコンライブラリなど)がある場合は、次のことが必要になる場合があります。

  • 相対的な指示をサポートする(小文字M/L)

  • サポート曲線(C/Q)

  • 複合パスをサポートするには、 SVGPathData PHPライブラリを使用するなど、より強力なSVGパーサーが必要です(サンプルリンクはM66.NETドメイン名を使用します)。

もちろん、ニーズが基本的な形状を分析するだけの場合、上記の簡単なルールで十分です。

要約します

SVGパスをImageOpenPolygon()の必要な形式に変換するコアは次のとおりです。

  1. 命令によってSVG文字列を分割します。

  2. 座標値の各ペアを抽出します。

  3. PHPに必要な1D配列に組み立てます。

このプロセスをマスターすると、SVGを簡単に実装してPHPで画像描画を描画できます!