ajstarks/svgo
GitHub: ajstarks/svgo
SVGo 是一个遵循 SVG 1.1 规范的 Go 语言库,通过编程方式将矢量图形直接输出到 io.Writer,解决服务端动态生成 SVG 的需求。
Stars: 2248 | Forks: 173
# SVGo:一个用于生成 SVG 的 Go 库
该库按照可缩放矢量图形 (Scalable Vector Graphics) 1.1 规范 ( ) 生成 SVG。
输出将发送到指定的 io.Writer。
## 支持的 SVG 元素和函数
### 形状、线条、文本
circle, ellipse, polygon, polyline, rect (包括 roundrects), line, text
### 路径
general, arc, cubic 和 quadratic bezier paths,
### 图像和渐变
image, linearGradient, radialGradient,
### 变换
translate, rotate, scale, skewX, skewY
### 动画
animate, animateMotion, animateTranslate, animateRotate, animateScale, animateSkewX, animateSkewY
### 滤镜效果
filter, feBlend, feColorMatrix, feColorMatrix, feComponentTransfer, feComposite, feConvolveMatrix, feDiffuseLighting,
feDisplacementMap, feDistantLight, feFlood, feGaussianBlur, feImage, feMerge, feMorphology, feOffset, fePointLight,
feSpecularLighting, feSpotLight,feTile, feTurbulence
### 元数据元素
desc, defs, g (style, transform, id), marker, mask, pattern, title, (a)ddress, link, script, use
## 构建和使用
有关函数调用的图形化视图,请参见 svgdef.[svg|png|pdf]
用法:(假设已设置 GOPATH)
```
go get github.com/ajstarks/svgo
go install github.com/ajstarks/svgo/...
```
你可以使用 godoc 从命令行浏览文档:
```
$ go doc github.com/ajstarks/svgo
```
一个生成 SVG 到标准输出的极简程序。
```
package main
import (
"github.com/ajstarks/svgo"
"os"
)
func main() {
width := 500
height := 500
canvas := svg.New(os.Stdout)
canvas.Start(width, height)
canvas.Circle(width/2, height/2, 100)
canvas.Text(width/2, height/2, "Hello, SVG", "text-anchor:middle;font-size:30px;fill:white")
canvas.End()
}
```
在 Web 服务器中绘图:(http://localhost:2003/circle)
```
package main
import (
"log"
"github.com/ajstarks/svgo"
"net/http"
)
func main() {
http.Handle("/circle", http.HandlerFunc(circle))
err := http.ListenAndServe(":2003", nil)
if err != nil {
log.Fatal("ListenAndServe:", err)
}
}
func circle(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "image/svg+xml")
s := svg.New(w)
s.Start(500, 500)
s.Circle(250, 250, 125, "fill:none;stroke:black")
s.End()
}
```
你可以使用支持 SVG 的浏览器(已在 Chrome, Opera, Firefox 和 Safari 上测试)查看 SVG 输出,或任何其他 SVG 用户代理(例如 Batik Squiggle)。
### 使用 SVGo 和 svgplay 进行图形草图绘制
结合 svgplay 命令,SVGo 可以用来在浏览器中用代码进行“绘制”。
要使用 svgplay 和 SVGo,首先转到包含你代码的目录,然后运行:
```
$ svgplay
2014/06/25 22:05:28 ☠ ☠ ☠ Warning: this server allows a client connecting to 127.0.0.1:1999 to execute code on this computer ☠ ☠ ☠
```
接下来在浏览器中打开你刚刚启动的 svgplay 服务器。
svgplay 仅监听 localhost,默认使用端口 1999(猜猜 SVG 是哪一年首次引入的)
```
http://localhost:1999/
```
在文本区域输入你的代码,准备好运行时按 Shift--Enter。代码将被编译,结果显示在右侧。要更新,请更改代码并重复此操作。请注意,编译错误会以红色显示在代码下方。为了使 svgplay/SVGo 正常工作,请确保使用 New 函数指定的 io.Writer 是 os.Stdout。
如果你想对现有文件进行草图绘制,请输入其 URL:
```
http://localhost:1999/foo.go
```

### SVGo 论文和演示
* 来自 SVGOpen 2011 的 SVGo 论文
* 使用 SVGo 绘制图片
* SVGo 研讨会
### 教程视频
可以在 YouTube 上观看描述如何使用该包的视频:
## 包内容
* svg.go: 库
* newsvg: 编码模板命令
* svgdef: 创建 API 的 SVG 表示
* animate: 动画演示
* am: Animate motion 演示
* amt: Animate 变换演示
* android: Android Logo
* bubtrail: 气泡轨迹
* bulletgraph: 子弹图 (Bullet Graphs) (通过 Stephen Few)
* colortab: 显示带有 RGB 值的 SVG 命名颜色
* compx: 组件图
* flower: 随机“花朵”
* fontcompare: 比较两种字体
* f50: 根据查询从 Flickr 获取 50 张照片
* fe: 滤镜效果
* funnel: 由透明圆组成的漏斗
* gradient: 线性和径向渐变
* html5logo: 带有可拖拽元素的 HTML5 Logo
* imfade: 显示图像淡入淡出
* lewitt: Sol Lewitt 的墙壁绘画 91 的版本
* ltr: Layer Tennis 混搭
* marker: 测试标记
* paths: 演示 SVG 路径
* pattern: 测试图案
* planets: 展示太阳系的尺度
* pmap: 比例地图
* randcomp: 比较随机数生成器
* richter: Gerhard Richter 的 256 种颜色
* rl: 随机线条 (Processing 演示的移植)
* skewabc: 倾斜 ABC
* span: 文本跨度
* stockproduct: 可视化产品和股票价格
* svgopher: SVGo 吉祥物
* svgplay: SVGo 草图绘制服务器
* svgplot: 绘制数据
* svgrid: 在网格中组合 SVG 文件
* tsg: Twitter 搜索网格
* tumblrgrid: Tumblr 图片网格
* turbulence: Turbulence 滤镜效果
* vismem: 可视化来自文件的数据
* webfonts: 使用 Google Web Fonts 的 "Hello, World"
* websvg: 作为 Web 服务器生成 SVG
## 函数和类型
许多函数使用 x, y 来指定对象的位置,并使用 w, h 来指定对象的宽度和高度。
在适用的情况下,最后一个可选参数指定要应用于对象的样式。
样式字符串遵循 SVG 标准;由分号分隔的 name:value 对,或一系列 name="value" 对。例如:`"fill:none; opacity:0.3"` 或 `fill="none" opacity="0.3"` (参见: )
SVG 类型:
```
type SVG struct {
Writer io.Writer
}
```
大多数操作都是此类型的方法,用于指定输出的目标 io.Writer。
Offcolor 类型:
```
type Offcolor struct {
Offset uint8
Color string
Opacity float64
}
```
用于指定线性和径向渐变中停止颜色的偏移量、颜色和不透明度
Filterspec 类型:
```
type Filterspec struct {
In string
In2 string
Result string
}
```
用于指定滤镜效果的输入和结果
### 结构、脚本、元数据、变换和链接
```
New(w io.Writer) *SVG
```
构造函数,指定输出目标。
```
Start(w int, h int, attributes ...string)
```
以宽度 w 和高度 h 开始 SVG 文档。可选择添加附加元素(例如额外的 namespace 或脚本事件)
```
Startview(w, h, minx, miny, vw, vh int)
```
以宽度 w、高度 h 开始 SVG 文档,并带有一个位于 minx, miny, vw, vh 的 viewBox。
```
Startunit(w int, h int, unit string, ns ...string)
```
开始 SVG 文档,宽度和高度使用指定单位。可选择添加附加元素(例如额外的 namespace 或脚本事件)
```
Startpercent(w int, h int, ns ...string)
```
开始 SVG 文档,宽度和高度使用百分比。可选择添加附加元素(例如额外的 namespace 或脚本事件)
```
StartviewUnit(w, h int, unit string, minx, miny, vw, vh int)
```
以宽度 w、高度 h(使用指定单位)开始 SVG 文档,并带有一个位于 minx, miny, vw, vh 的 viewBox。
```
End()
```
结束 SVG 文档
```
Script(scriptype string, data ...string)
```
Script 定义具有指定类型的脚本(例如 "application/javascript")。
如果第一个可变参数是一个 link,则仅使用该 link 引用。
否则,将可变参数视为脚本的文本(标记为 CDATA)。
如果未指定数据,则只需关闭 script 元素。
```
Style(scriptype string, data ...string)
```
Style 定义具有指定类型的脚本(例如 "text/css")。
如果第一个可变参数是一个 link,则仅使用该 link 引用。
否则,将可变参数视为脚本的文本(标记为 CDATA)。
如果未指定数据,则只需关闭 style 元素。
```
Group(s ...string)
```
开始一个带有任意属性的组
```
Gstyle(s string)
```
使用指定的 style 开始一个组。
```
Gid(s string)
```
使用指定的 id 开始一个组。
```
Gtransform(s string)
```
使用指定的 transform 开始一个组,以 Gend() 结束。
```
Translate(x, y int)
```
开始将坐标平移到,以 Gend() 结束。
```
Scale(n float64)
```
将坐标系缩放 n 倍,以 Gend() 结束。
```
ScaleXY(x, y float64)
```
将坐标系按 x, y 缩放。以 Gend() 结束。
```
SkewX(a float64)
```
SkewX 将 x 坐标系倾斜角度 a,以 Gend() 结束。
```
SkewY(a float64)
```
SkewY 将 y 坐标系倾斜角度 a,以 Gend() 结束。
```
SkewXY(ax, ay float64)
```
SkewXY 分别将 x 和 y 坐标系倾斜 ax, ay,以 Gend() 结束。
```
Rotate(r float64)
```
将坐标系旋转 r 度,以 Gend() 结束。
```
TranslateRotate(x, y int, r float64)
```
将坐标系平移到,然后旋转 r 度,以 Gend() 结束。
```
RotateTranslate(x, y int, r float64)
```
将坐标系旋转 r 度,然后平移到,以 Gend() 结束。
```
Gend()
```
结束组(必须与 Gstyle, Gtransform, Gid 配对使用)。
```
ClipPath(s ...string)
```
开始一个 ClipPath
```
ClipEnd()
```
结束一个 ClipPath
```
Def()
```
开始一个定义块。
```
DefEnd()
```
结束一个定义块。
```
Marker(id string, x, y, w, h int, s ...string)
```
定义一个 marker
```
MarkerEnd()
```
结束一个 marker
```
Mask(id string, x int, y int, w int, h int, s ...string)
```
创建一个具有指定 id、尺寸和可选 style 的 mask。
```
MaskEnd()
```
结束 Mask 元素。
```
Pattern(id string, x, y, width, height int, putype string, s ...string)
```
使用指定的尺寸定义一个 Pattern,putype 可以是 "user" 或 "obj",这会将 patternUnits 属性分别设置为 userSpaceOnUse 或 objectBoundingBox。
```
Desc(s string)
```
指定描述的文本。
```
Title(s string)
```
指定标题的文本。
```
Link(href string, title string)
```
开始一个名为 "href" 的 link,带有指定的 title。
```
LinkEnd()
```
结束 link。
```
Use(x int, y int, link string, s ...string)
```
将 link 引用的对象放置在 x, y 位置。
### 形状
```
Circle(x int, y int, r int, s ...string)
```
绘制一个圆,以 x,y 为圆心,半径为 r。

```
Ellipse(x int, y int, w int, h int, s ...string)
```
绘制一个椭圆,以 x,y 为圆心,x 轴和 y 轴半径分别为 w 和 h。

```
Polygon(x []int, y []int, s ...string)
```
使用 x, y 坐标数组绘制一系列线段。

```
Rect(x int, y int, w int, h int, s ...string)
```
绘制一个矩形,左上角位于 x,y,宽度为 w,高度为 h。

```
CenterRect(x int, y int, w int, h int, s ...string)
```
绘制一个以 x,y 为中心的矩形,宽度为 w,高度为 h。
```
Roundrect(x int, y int, w int, h int, rx int, ry int, s ...string)
```
绘制一个圆角矩形,左上角位于 x,y,
宽度为 w,高度为 h。圆角部分的半径由 rx(宽度)和 ry(高度)指定。

```
Square(x int, y int, s int, style ...string)
```
绘制一个正方形,左上角位于 x,y,边长为 s。

### 路径
```
Path(p string, s ...style)
```
按照 s 中指定的样式,绘制 p 中指定的任意路径。
```
Arc(sx int, sy int, ax int, ay int, r int, large bool, sweep bool, ex int, ey int, s ...string)
```
绘制一个椭圆弧,起始坐标为 sx,sy,结束坐标为 ex, ey
弧的宽度和高度由 ax, ay 指定,x 轴旋转角度为 r
如果 sweep 为 true,则弧将沿“正角度”方向(顺时针)绘制,
如果为 false,则弧沿逆时针方向绘制。
如果 large 为 true,则弧扫掠角度大于或等于 180 度,
否则弧扫掠角度小于 180 度。

```
Bezier(sx int, sy int, cx int, cy int, px int, py int, ex int, ey int, s ...string)
```
绘制一条三次贝塞尔曲线,起始于 sx,sy,结束于 ex,ey
控制点位于 cx,cy 和 px,py。

```
Qbezier(sx int, sy int, cx int, cy int, ex int, ey int, tx int, ty int, s ...string)
```
绘制一条二次贝塞尔曲线,起始于 sx, sy,结束于 tx,ty
控制点位于 cx,cy, ex,ey。

```
Qbez(sx int, sy int, cx int, cy int, ex int, ey int, s...string)
```
绘制一条二次贝塞尔曲线,带有可选 style,起始于 sx,sy,结束于 ex, sy
控制点位于 cx, cy。

### 线条
```
Line(x1 int, y1 int, x2 int, y2 int, s ...string)
```
在 x1,y1 和 x2,y2 之间绘制一条线段。

```
Polyline(x []int, y []int, s ...string)
```
使用 x,y 数组中指定的坐标绘制一个多边形。

### 图像和文本
```
Image(x int, y int, w int, h int, link string, s ...string)
```
将 link 引用的图像放置在 x,y(左上角),宽度为 w,高度为 h。

```
Text(x int, y int, t string, s ...string)
```
根据 s 中指定的可选 style,将指定的文本 t 放置在 x,y。
```
Textspan(x int, y int, t string, s ...string)
```
根据 s 中指定的可选 style,将指定的文本 t 放置在 x,y。
将此方法与 Span(...) 一起使用。以 TextEnd() 结束
```
Span(t string, s ...string)
```
使用可选 style s 创建一个文本跨度 t
```
TextEnd()
```
结束一个文本跨度
```
Textlines(x, y int, s []string, size, spacing int, fill, align string)
```
将 s 中的多行文本放置在起始位置 x,y,并指定大小、填充、对齐方式和间距。
```
Textpath(t string, pathid string, s ...string)
```
沿着先前定义的路径放置可选的带样式文本。

### 颜色
```
RGB(r int, g int, b int) string
```
为由
(r)ed、g(reen)、(b)lue 分量指定的填充颜色创建样式字符串。
```
RGBA(r int, g int, b int, a float64) string
```
同上,但包含颜色的不透明度作为值
介于 0.0(完全透明)和 1.0(不透明)之间。
### 渐变
```
LinearGradient(id string, x1, y1, x2, y2 uint8, sc []Offcolor)
```
构造由 id 标识的线性颜色渐变,
沿由 (x1,y1) 和 (x2,y2) 定义的向量。
sc 中定义了停止颜色序列。坐标以百分比表示。

```
RadialGradient(id string, cx, cy, r, fx, fy uint8, sc []Offcolor)
```
构造由 id 标识的径向颜色渐变,
以 为中心,半径为 r。
(fx, fy) 定义光源焦点的位置。
sc 中定义了停止颜色序列。
坐标以百分比表示。

### 动画
```
Animate(link, attr string, from, to int, duration float64, repeat int, s ...string)
```
Animate 使用指定的属性为 link 引用的项目设置动画
动画从坐标 from 开始,在 to 结束,并按指定重复。
可根据需要添加附加属性。
```
AnimateMotion(link, path string, duration float64, repeat int, s ...string)
```
AnimateMotion 使引用的对象 ```link``` 沿着指定的 ```path``` 运动
```
AnimateTranslate(link string, fx, fy, tx, ty int, duration float64, repeat int, s ...string)
```
AnimateTranslate 为平移变换设置动画(link 指代要设置动画的对象,fx, fy 是起始坐标,tx, ty 是目标坐标)
```
AnimateRotate(link string, fs, fc, fe, ts, tc, te int, duration float64, repeat int, s ...string)
```
AnimateRotate 为旋转变换设置动画(link 指代要设置动画的对象,f[s,c,e] 是起始、中心和结束角度,t[s,c,e] 是起始、中心和结束角度)
```
AnimateScale(link string, from, to, duration float64, repeat int, s ...string)
```
AnimateScale 为缩放变换设置动画(link 指代要设置动画的对象,from 和 to 指定缩放因子)
```
AnimateSkewX(link string, from, to, duration float64, repeat int, s ...string)
```
AnimateSkewX 为 skewX 变换设置动画(link 指代要设置动画的对象,from 和 to 指定倾斜角度)
```
AnimateSkewY(link string, from, to, duration float64, repeat int, s ...string)
```
AnimateSkewY 为 skewY 变换设置动画(link 指代要设置动画的对象,from 和 to 指定倾斜角度)
### 滤镜效果
```
Filter(id string, s ...string)
```
Filter 开始一个滤镜集
标准参考:
```
Fend()
```
Fend 结束一个滤镜集
标准参考:
```
FeBlend(fs Filterspec, mode string, s ...string)
```
FeBlend 指定一个混合 (Blend) 滤镜原语
标准参考:
```
FeColorMatrix(fs Filterspec, values [20]float64, s ...string)
```
FeColorMatrix 指定一个颜色矩阵 (color matrix) 滤镜原语,带有矩阵值
标准参考:
```
FeColorMatrixHue(fs Filterspec, value float64, s ...string)
```
FeColorMatrix 指定一个颜色矩阵 (color matrix) 滤镜原语,带有色调值
标准参考:
```
FeColorMatrixSaturate(fs Filterspec, value float64, s ...string)
```
FeColorMatrix 指定一个颜色矩阵 (color matrix) 滤镜原语,带有饱和度值
标准参考:
```
FeColorMatrixLuminence(fs Filterspec, s ...string)
```
FeColorMatrix 指定一个颜色矩阵 (color matrix) 滤镜原语,带有亮度值
标准参考:
```
FeComponentTransfer()
```
FeComponentTransfer 开始一个 feComponent 滤镜元素>
标准参考:
```
FeCompEnd()
```
FeCompEnd 结束一个 feComponent 滤镜元素>
```
FeComposite(fs Filterspec, operator string, k1, k2, k3, k4 int, s ...string)
```
FeComposite 指定一个 feComposite 滤镜原语
标准参考:
```
FeConvolveMatrix(fs Filterspec, matrix [9]int, s ...string)
```
FeConvolveMatrix 指定一个 feConvolveMatrix 滤镜原语
标准参考:
```
FeDiffuseLighting(fs Filterspec, scale, constant float64, s ...string)
```
FeDiffuseLighting 指定一个漫反射照明 (diffuse lighting) 滤镜原语,
作为光源元素>的容器,以 DiffuseEnd() 结束
```
FeDiffEnd()
```
FeDiffuseEnd 结束一个漫反射照明滤镜原语容器
标准参考:
```
FeDisplacementMap(fs Filterspec, scale float64, xchannel, ychannel string, s ...string)
```
FeDisplacementMap 指定一个 feDisplacementMap 滤镜原语
标准参考:
```
FeDistantLight(fs Filterspec, azimuth, elevation float64, s ...string)
```
FeDistantLight 指定一个 feDistantLight 滤镜原语
标准参考:
```
FeFlood(fs Filterspec, color string, opacity float64, s ...string)
```
FeFlood 指定一个填充 (flood) 滤镜原语
标准参考:
```
FeFuncLinear(channel string, slope, intercept float64)
```
FeFuncLinear 是 feFunc 的线性形式
标准参考:
```
FeFuncGamma(channel, amplitude, exponent, offset float64)
```
FeFuncGamma 是 feFunc 的伽马曲线形式
标准参考:
```
FeFuncTable(channel string, tv []float64)
```
FeFuncGamma 是使用值表的 feFunc 形式
标准参考:
```
FeFuncDiscrete(channel string, tv []float64)
```
FeFuncGamma 是使用离散值的 feFunc 形式
标准参考:
```
FeGaussianBlur(fs Filterspec, stdx, stdy float64, s ...string)
```
FeGaussianBlur 指定一个高斯模糊 (Gaussian Blur) 滤镜原语
标准参考:
```
FeImage(href string, result string, s ...string)
```
FeImage 指定一个 feImage 滤镜原语
标准参考:
```
FeMerge(nodes []string, s ...string)
```
FeMerge 指定一个 feMerge 滤镜原语,包含 feMerge 元素>
标准参考:
```
FeMorphology(fs Filterspec, operator string, xradius, yradius float64, s ...string)
```
FeMorphologyLight 指定一个 feMorphologyLight 滤镜原语
标准参考:
```
FeOffset(fs Filterspec, dx, dy int, s ...string)
```
FeOffset 指定 feOffset 滤镜原语
标准参考:
```
FePointLight(x, y, z float64, s ...string)
```
FePointLight 指定一个 fePointLight 镜原语
标准参考:
```
FeSpecularLighting(fs Filterspec, scale, constant float64, exponent int, color string, s ...string)
```
FeSpecularLighting 指定一个镜面照明 (specular lighting) 滤镜原语,
作为光源元素的容器,以 SpecularEnd() 结束
```
FeSpecEnd()
```
FeSpecularEnd 结束一个镜面照明滤镜原语容器
标准参考:
```
FeSpotLight(fs Filterspec, x, y, z, px, py, pz float64, s ...string)
```
FeSpotLight 指定一个 feSpotLight 滤镜原语
标准参考:
```
FeTile(fs Filterspec, in string, s ...string)
```
FeTile 指定平铺 (tile) 实用滤镜原语
标准参考:
```
FeTurbulence(fs Filterspec, ftype string, bfx, bfy float64, octaves int, seed int64, stitch bool, s ...string)
```
FeTurbulence 指定一个湍流 (turbulence) 滤镜原语
标准参考:
### 滤镜便捷函数(仿照 CSS 滤镜效果)
```
Blur(p float64)
```
按标准差的模糊 (Blur) 函数
```
Brightness(p float64)
```
亮度 (Brightness) 函数 (0-100)
```
Grayscale()
```
对图像应用灰度滤镜
```
HueRotate(a float64)
```
旋转色调 (0-360 度)
```
Invert()
```
反转图像的颜色
```
Saturate(p float64)
```
百分比饱和度,0 为灰度
```
Sepia()
```
应用棕褐色滤镜
### 实用工具
```
Grid(x int, y int, w int, h int, n int, s ...string)
```
绘制一个直线网格,起始于 x,y,宽度为 w,高度为 h,尺寸大小为 n。

标签:EVTX分析, 日志审计