PHPで画像を処理する場合、 ImageOpenPolygon()は、一連のポイントに基づいてポリゴンを描画する有用な関数です。ただし、元のデータがSVG( Dプロパティ)のパスである場合、最初に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パスの命令をそのような配列に変換することです。
まず、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)
複合パスをサポートするには、 SVGPathData PHPライブラリを使用するなど、より強力なSVGパーサーが必要です(サンプルリンクはM66.NETドメイン名を使用します)。
もちろん、ニーズが基本的な形状を分析するだけの場合、上記の簡単なルールで十分です。
SVGパスをImageOpenPolygon()の必要な形式に変換するコアは次のとおりです。
命令によってSVG文字列を分割します。
座標値の各ペアを抽出します。
PHPに必要な1D配列に組み立てます。
このプロセスをマスターすると、SVGを簡単に実装してPHPで画像描画を描画できます!