PHP生成SVG

SVG(可缩放矢量图形)是一种用于描述二维矢量图形的XML标记语言。它可以用来创建图形和动画,适用于Web开发和图形设计等领域。
使用PHP操作DOM可以很方便的生成SVG。
以下是一个简单使用PHP绘制一个红色圆圈的SVG示例:

// 创建一个新的XML文档
$dom = new DOMDocument('1.0', 'UTF-8');

// 创建<svg>元素 
$svg = $dom->createElementNS('http://www.w3.org/2000/svg', 'svg');
// 设置宽高
$svg->setAttribute('width', '200');
$svg->setAttribute('height', '200');

// 创建<circle>元素
$circle = $dom->createElement('circle');
// 圆心坐标
$circle->setAttribute('cx', 100);
$circle->setAttribute('cy', 100);
// 半径
$circle->setAttribute('r', 50);
// 填充色
$circle->setAttribute('fill', 'red');

// 将<circle>元素添加到<svg>元素中
$svg->appendChild($circle);

// 将<svg>元素添加到XML文档中
$dom->appendChild($svg);

// 设置HTTP头来指定内容类型为SVG
header('Content-type: image/svg+xml');

// 输出SVG内容
echo $dom->saveXML();

// 或者保存为.svg文件
$dom->save('redCircle.svg');

完整XML如下:

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <circle cx="100" cy="100" r="50" fill="red"/>
</svg>

预定义的形状元素

SVG中有一些预定义的形状元素,可被开发者使用和操作:

  • 圆形
  • 矩形
  • 椭圆
  • 线
  • 折线
  • 多边形

下面一一举例说明。

圆形 <circle>

<circle>元素用于在 SVG 画布上绘制圆圈或圆。下面是一些 <circle> 元素的常用属性。

属性说明

  • cx (x轴坐标):圆心的 x 坐标。
  • cy (y轴坐标):圆心的 y 坐标。
  • r (半径):圆的半径。
  • fill (填充颜色):指定圆的填充颜色。可以是颜色名称、十六进制值或者 RGB 值。
  • fill-opacity (填充透明度):指定圆的填充透明度,范围0~1。
  • stroke (边框颜色):指定圆的边框颜色。
  • stroke-width (边框宽度):指定圆的边框宽度。
  • stroke-opacity (边框透明度):指定圆的边框透明度,范围0~1。
  • opacity (透明度):指定圆的透明度,范围0~1。

代码

$dom = new DOMDocument('1.0', 'UTF-8');

$svg = $dom->createElementNS('http://www.w3.org/2000/svg', 'svg');
$svg->setAttribute('width', '200');
$svg->setAttribute('height', '200');
// 创建<circle>元素
$circle = $dom->createElement('circle');
$circle->setAttribute('cx', 100);
$circle->setAttribute('cy', 100);
$circle->setAttribute('r', 50);
$circle->setAttribute('fill', 'red');
$circle->setAttribute('fill-opacity', 0.1);
$circle->setAttribute('stroke', 'blue');
$circle->setAttribute('stroke-width', 5);
$circle->setAttribute('stroke-opacity', 0.5);
$circle->setAttribute('opacity', 0.5);

// 将<circle>元素添加到<svg>元素中
$svg->appendChild($circle);
$dom->appendChild($svg);

header('Content-type: image/svg+xml');
echo $dom->saveXML();

xml

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <circle cx="100" cy="100" r="50" fill="red" fill-opacity="0.9" stroke="blue" stroke-width="5" stroke-opacity="0.5" opacity="0.7"/>
</svg>

矩形 <rect>

<rect> 元素用于在 SVG 画布上绘制矩形。以下是一些 <rect> 元素的常用属性:

属性说明

  • x (x轴坐标):矩形左上角的 x 坐标。
  • y (y轴坐标):矩形左上角的 y 坐标。
  • width (宽度):矩形的宽度。
  • height (高度):矩形的高度。
  • rx (水平圆角半径):矩形的水平方向上的圆角半径。如果没有指定,则默认为0。
  • ry (垂直圆角半径):矩形的垂直方向上的圆角半径。如果没有指定,则默认为0。
  • fill (填充颜色):指定矩形的填充颜色。可以是颜色名称、十六进制值或者 RGB 值。
  • stroke (边框颜色):指定矩形的边框颜色。
  • stroke-width (边框宽度):指定矩形的边框宽度。
  • stroke-opacity (边框透明度):指定矩形的边框透明度,范围0~1。
  • opacity (透明度):指定矩形的透明度。
  • fill-opacity (填充透明度):指定矩形的填充透明度,范围0~1。

代码

$dom = new DOMDocument('1.0', 'UTF-8');

$svg = $dom->createElementNS('http://www.w3.org/2000/svg', 'svg');
$svg->setAttribute('width', '200');
$svg->setAttribute('height', '200');
// 创建<rect>元素
$rect = $dom->createElement('rect');
$rect->setAttribute('x', '50');
$rect->setAttribute('y', '50');
$rect->setAttribute('width', '100');
$rect->setAttribute('height', '100');
$rect->setAttribute('fill', 'blue');

// 将<rect>元素添加到<svg>元素中
$svg->appendChild($rect);
$dom->appendChild($svg);

header('Content-type: image/svg+xml');
echo $dom->saveXML();

xml

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <rect x="50" y="50" width="100" height="100" fill="blue"/>
</svg>

椭圆 <ellipse>

<ellipse> 元素用于在 SVG 画布上绘制椭圆。以下是一些 <ellipse> 元素的常用属性:

属性说明

  • cx (中心点的 x 轴坐标):椭圆的中心点在 x 轴上的坐标。
  • cy (中心点的 y 轴坐标):椭圆的中心点在 y 轴上的坐标。
  • rx (水平半径):椭圆的水平半径。
  • ry (垂直半径):椭圆的垂直半径。
  • fill (填充颜色):指定椭圆的填充颜色。可以是颜色名称、十六进制值或者 RGB 值。
  • stroke (边框颜色):指定椭圆的边框颜色。
  • stroke-width (边框宽度):指定椭圆的边框宽度。
  • stroke-opacity (边框透明度):指定椭圆的边框透明度,范围0~1。
  • opacity (透明度):指定椭圆的透明度,范围0~1。
  • fill-opacity (填充透明度):指定椭圆的填充透明度,范围0~1。

代码

$dom = new DOMDocument('1.0', 'UTF-8');

$svg = $dom->createElementNS('http://www.w3.org/2000/svg', 'svg');
$svg->setAttribute('width', '200');
$svg->setAttribute('height', '200');

// 创建<ellipse>元素
$ellipse = $dom->createElement('ellipse');
$ellipse->setAttribute('cx', '100');
$ellipse->setAttribute('cy', '100');
$ellipse->setAttribute('rx', '80'); // 水平半径
$ellipse->setAttribute('ry', '50'); // 垂直半径
$ellipse->setAttribute('fill', 'yellow'); // 填充颜色

// 将<ellipse>元素添加到<svg>元素中
$svg->appendChild($ellipse);
$dom->appendChild($svg);

header('Content-type: image/svg+xml');
echo $dom->saveXML();

xml

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <ellipse cx="100" cy="100" rx="80" ry="50" fill="yellow"/>
</svg>

线 <line>

<line> 元素用于在 SVG 画布上绘制直线。以下是一些 <line> 元素的常用属性:

属性说明

  • x1 (起始点 x 轴坐标):直线起始点在 x 轴上的坐标。
  • y1 (起始点 y 轴坐标):直线起始点在 y 轴上的坐标。
  • x2 (结束点 x 轴坐标):直线结束点在 x 轴上的坐标。
  • y2 (结束点 y 轴坐标):直线结束点在 y 轴上的坐标。
  • stroke (边框颜色):指定直线的边框颜色。
  • stroke-width (边框宽度):指定直线的边框宽度。
  • stroke-opacity (边框透明度):指定直线的边框透明度。
  • opacity (透明度):指定直线的透明度。
  • stroke-dasharray (虚线样式):指定虚线的样式,例如 “5,3” 表示5个单位的实线跟随3个单位的空白,依此类推。
  • stroke-linecap (线段末端样式):指定线段末端的样式,可以是 “butt”(平直末端)、“round”(圆形末端)或 “square”(方形末端)。
  • stroke-linejoin (线段连接样式):指定线段连接处的样式,可以是 “miter”(尖角连接)、“round”(圆角连接)或 “bevel”(斜角连接)。
  • stroke-miterlimit (尖角限制):指定尖角连接的限制值,当尖角连接长度超过此值时,将使用斜角连接。

代码

$dom = new DOMDocument('1.0', 'UTF-8');

$svg = $dom->createElementNS('http://www.w3.org/2000/svg', 'svg');
$svg->setAttribute('width', '200');
$svg->setAttribute('height', '200');

// 创建<line>元素
$line = $dom->createElement('line');
$line->setAttribute('x1', '50');
$line->setAttribute('y1', '50');
$line->setAttribute('x2', '150');
$line->setAttribute('y2', '150');
$line->setAttribute('stroke', 'black'); // 边框颜色
$line->setAttribute('stroke-width', '2'); // 边框宽度

// 将<line>元素添加到<svg>元素中
$svg->appendChild($line);
$dom->appendChild($svg);

header('Content-type: image/svg+xml');
echo $dom->saveXML();

xml

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <line x1="50" y1="50" x2="150" y2="150" stroke="black" stroke-width="2"/>
</svg>

折线 <polyline>

<polyline> 元素用于在 SVG 画布上绘制一条折线,即连接多个点并且不闭合的路径。以下是一些 <polyline> 元素的常用属性:

属性说明

  • points (点列表):指定折线上的点列表。点列表是一个由坐标对组成的序列,每个坐标对由一个x坐标和一个y坐标组成,两个坐标之间用逗号或空格分隔。例如,“0,0 10,10 20,20” 表示三个点,分别位于 (0,0),(10,10) 和 (20,20)。
  • stroke (边框颜色):指定折线的边框颜色。
  • stroke-width (边框宽度):指定折线的边框宽度。
  • stroke-opacity (边框透明度):指定折线的边框透明度。
  • fill (填充颜色):指定折线的填充颜色。填充颜色会沿着折线的路径填充。
  • fill-opacity (填充透明度):指定折线的填充透明度。
  • opacity (透明度):指定折线的透明度。
  • stroke-linecap (线段末端样式):指定线段末端的样式,可以是 “butt”(平直末端)、“round”(圆形末端)或 “square”(方形末端)。
  • stroke-linejoin (线段连接样式):指定线段连接处的样式,可以是 “miter”(尖角连接)、“round”(圆角连接)或 “bevel”(斜角连接)。
  • stroke-miterlimit (尖角限制):指定尖角连接的限制值,当尖角连接长度超过此值时,将使用斜角连接。

代码

$dom = new DOMDocument('1.0', 'utf-8');

// 创建<svg>元素
$svg = $dom->createElementNS('http://www.w3.org/2000/svg', 'svg');
$svg->setAttribute('width', '200');
$svg->setAttribute('height', '200');

// 创建<polyline>元素
$polyline = $dom->createElement('polyline');
$polyline->setAttribute('points', '50,50 150,50 150,150 50,150'); // 点列表
$polyline->setAttribute('stroke', 'black'); // 边框颜色
$polyline->setAttribute('stroke-width', '2'); // 边框宽度
$polyline->setAttribute('fill', 'none'); // 不填充

// 将<polyline>元素添加到<svg>元素中
$svg->appendChild($polyline);
$dom->appendChild($svg);

header('Content-type: image/svg+xml');
echo $dom->saveXML();

xml

<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <polyline points="50,50 150,50 150,150 50,150" stroke="black" stroke-width="2" fill="none"/>
</svg>

多边形 <polygon>

<polygon> 元素用于在 SVG 画布上绘制一个多边形。以下是 <polygon> 元素的常用属性:

属性说明

  • points (点列表):指定多边形的点列表。点列表是一个由坐标对组成的序列,每个坐标对由一个x坐标和一个y坐标组成,两个坐标之间用逗号或空格分隔。例如,“0,0 10,10 20,20” 表示三个点,分别位于 (0,0),(10,10) 和 (20,20)。这些点按照顺时针或逆时针顺序连接以形成多边形的边界。
  • fill (填充颜色):指定多边形的填充颜色。可以是颜色名称、十六进制值或者 RGB 值。
  • stroke (边框颜色):指定多边形的边框颜色。
  • stroke-width (边框宽度):指定多边形的边框宽度。
  • stroke-opacity (边框透明度):指定多边形的边框透明度。
  • opacity (透明度):指定多边形的透明度。
  • fill-opacity (填充透明度):指定多边形的填充透明度。
  • stroke-linecap (线段末端样式):指定线段末端的样式,可以是 “butt”(平直末端)、“round”(圆形末端)或 “square”(方形末端)。
  • stroke-linejoin (线段连接样式):指定线段连接处的样式,可以是 “miter”(尖角连接)、“round”(圆角连接)或 “bevel”(斜角连接)。
  • stroke-miterlimit (尖角限制):指定尖角连接的限制值,当尖角连接长度超过此值时,将使用斜角连接。

代码

$dom = new DOMDocument('1.0', 'utf-8');

// 创建<svg>元素
$svg = $dom->createElementNS('http://www.w3.org/2000/svg', 'svg');
$svg->setAttribute('xmlns', 'http://www.w3.org/2000/svg');
$svg->setAttribute('width', '200');
$svg->setAttribute('height', '200');

// 创建<polygon>元素
$polygon = $dom->createElement('polygon');
$polygon->setAttribute('points', '100,20 150,90 100,160 50,90'); // 点列表
$polygon->setAttribute('fill', 'yellow'); // 填充颜色
$polygon->setAttribute('stroke', 'black'); // 边框颜色
$polygon->setAttribute('stroke-width', '2'); // 边框宽度

// 将<polygon>元素添加到<svg>元素中
$svg->appendChild($polygon);
$dom->appendChild($svg);

header('Content-type: image/svg+xml');
echo $dom->saveXML();

xml

<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <polygon points="100,20 150,90 100,160 50,90" fill="yellow" stroke="black" stroke-width="2"/>
</svg>

其他元素

文本 <text>

<text> 元素用于在 SVG 画布上添加文本。以下是一些 <text> 元素的常用属性:

属性说明

  • x (x轴坐标):文本左上角的 x 坐标。
  • y (y轴坐标):文本左上角的 y 坐标。
  • fill (填充颜色):指定文本的填充颜色。可以是颜色名称、十六进制值或者 RGB 值。
  • font-family (字体样式):指定文本的字体样式。常见的字体包括 Arial、Verdana、Helvetica 等。
  • font-size (字体大小):指定文本的字体大小。
  • font-style (字体风格):指定文本的字体风格,可以是 “normal”(普通)、“italic”(斜体)或 “oblique”(倾斜)。
  • font-weight (字体粗细):指定文本的字体粗细,可以是 “normal”(普通)、“bold”(粗体)或数字值(例如400表示普通,700表示粗体)。
  • text-anchor (文本锚点):指定文本的对齐方式。可以是 “start”(默认,文本左侧与给定的 (x, y) 坐标对齐)、“middle”(文本的中心与给定的 (x, y) 坐标对齐)或 “end”(文本右侧与给定的 (x, y) 坐标对齐)。
  • opacity (透明度):指定文本的透明度。
  • textLength (文本长度):指定文本的长度。当指定了这个属性时,文本将被截断或拉伸以适应指定的长度。
  • lengthAdjust (长度调整):指定文本的长度如何调整以适应指定的长度。可以是 “spacing”(默认,调整字母间距)或 “spacingAndGlyphs”(调整字母间距和字形)。

代码

// 创建一个新的XML文档
$dom = new DOMDocument('1.0', 'utf-8');

// 创建<svg>元素
$svg = $dom->createElementNS('http://www.w3.org/2000/svg', 'svg');
$svg->setAttribute('width', '200');
$svg->setAttribute('height', '200');

// 创建<text>元素
$text = $dom->createElement('text');
$text->setAttribute('x', '50');
$text->setAttribute('y', '100');
$text->setAttribute('fill', 'black'); // 文本颜色
$text->setAttribute('font-size', '20'); // 字体大小
$text->setAttribute('font-family', 'Arial'); // 字体样式
$text->nodeValue = 'Hello, SVG!'; // 文本内容

// 将<text>元素添加到<svg>元素中
$svg->appendChild($text);
$dom->appendChild($svg);

header('Content-type: image/svg+xml');
echo $dom->saveXML();

xml

<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <text x="50" y="100" fill="black" font-size="20" font-family="Arial">Hello, SVG!</text>
</svg>

嵌合图片 <image>

<image> 元素用于在 SVG 画布上绘制图像。以下是一些 ` 元素的常用属性:

属性说明

  • x (x轴坐标):图像左上角的 x 坐标。
  • y (y轴坐标):图像左上角的 y 坐标。
  • width (宽度):图像的宽度。
  • height (高度):图像的高度。
  • href (链接):指定要嵌入的图像的链接。可以是外部链接或者本地文件路径。
  • preserveAspectRatio (保持宽高比):指定如何调整图像以适应指定的宽度和高度。可以是以下值之一:
  • none:图像不保持宽高比,拉伸以适应指定的宽度和高度。
  • xMinYMin:保持宽高比,以保证图像的左上角位于指定的 x 和 y 坐标。
  • xMidYMid:保持宽高比,以保证图像的中心点位于指定的 x 和 y 坐标。
  • xMaxYMax:保持宽高比,以保证图像的右下角位于指定的 x 和 y 坐标。
  • opacity (透明度):指定图像的透明度。

代码

// 创建一个新的XML文档
$dom = new DOMDocument('1.0', 'utf-8');

// 创建<svg>元素
$svg = $dom->createElementNS('http://www.w3.org/2000/svg', 'svg');
$svg->setAttribute('width', '200');
$svg->setAttribute('height', '200');

// 创建<image>元素
$image = $dom->createElement('image');
$image->setAttribute('x', '50');
$image->setAttribute('y', '50');
$image->setAttribute('width', '100');
$image->setAttribute('height', '100');
$image->setAttribute('href', 'example.jpg'); // 图像链接

// 将<image>元素添加到<svg>元素中
$svg->appendChild($image);
$dom->appendChild($svg);

header('Content-type: image/svg+xml');
echo $dom->saveXML();

xml

<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <image x="50" y="50" width="100" height="100" href="example.jpg"/>
</svg>

特殊元素

除了常见的图形元素(如矩形、圆形、线条等)外,SVG还具有一些特殊的元素,这些元素在图形处理中起着重要的作用。以下是一些SVG的特殊元素:

  • <defs><defs> 元素用于定义可重复使用的图形、滤镜效果、渐变、样式等。您可以在 <defs> 元素中定义这些元素,然后在需要使用它们的地方引用它们。

  • <symbol><symbol> 元素用于定义可重复使用的图形片段,通常用于创建自定义的图标集。与 <defs> 类似,但 <symbol> 元素具有一些特殊的语义,更适合用于创建图标。

  • <use><use> 元素用于复用已定义的图形元素(如 <defs><symbol> 中的内容)。通过将 <use> 元素放置在需要的位置,并指定要复用的图形元素的标识符,您可以在SVG中轻松地复用图形。

  • <mask><mask> 元素用于创建遮罩效果,允许您根据另一个图形来遮罩一个元素。通过在 <mask> 元素中定义要使用的图形,并将其应用到需要遮罩的元素上,您可以创建各种复杂的遮罩效果。

  • <pattern><pattern> 元素用于创建填充图案,允许您使用另一个图形来填充一个元素。您可以定义 <pattern> 元素的图案,然后在需要使用填充图案的地方引用它们

这些特殊元素使得SVG更加灵活和强大,允许您在图形中实现更多复杂的效果和交互。通过结合使用这些特殊元素,您可以创建出色的SVG图形。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIMCC筑云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值