添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

SVG文件简介

SVG 是使用 XML 来描述二维图形和绘图程序的语言。

  • SVG 指可伸缩矢量图形 (Scalable Vector Graphics)
  • SVG 用来定义用于网络的基于矢量的图形
  • SVG 使用 XML 格式定义图形
  • SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失
  • SVG 是万维网联盟的标准
  • SVG 与诸如 DOM 和 XSL 之类的 W3C 标准是一个整体

SVG文件包含的形状如下:

  • 矩形 <rect>
    矩形包含起始点坐标以及宽高信息。
id="rect3713" width="29.666916" height="27.528765" x="28.865108" y="77.838989" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
  • 圆形 <circle>
    圆形包含中心点坐标以及半径。
    <circle
       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       id="path5986"
       cx="88.198929"
       cy="92.27153"
       r="13.630746" />
  • 椭圆 <ellipse>
    椭圆包含中心点坐标以及XY轴半径,圆形可以认为是特殊的椭圆,即XY轴半径相同。
    <ellipse
       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       id="path5984"
       cx="64.946495"
       cy="121.13665"
       rx="14.165285"
       ry="7.2162771" />
  • 线 <line>
    直线包含起点与终点的坐标。
x1="36.883194" y1="142.51821" x2="69.490076" y2="142.51821" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
  • 折线 <polyline>
    折线包含多个点,每个点包含XY轴坐标。
    <polyline
       points="20,20 40,25 60,40 80,120 120,140 200,180"
       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
  • 多边形 <polygon>
    多边形可以认为是封闭的折线。
    <polygon
       points="100,10 150,190 60,210"
       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
  • 路径 <path>
    路径是使用命令的形式记录形状。
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 102.09696,131.02562 151.27455,113.6531" id="path5994"

用于路径的命令如下:
M = moveto
L = lineto
H = horizontal lineto
V = vertical lineto
C = curveto
S = smooth curveto
Q = quadratic Belzier curve
T = smooth quadratic Belzier curveto
A = elliptical Arc
Z = closepath
注释:以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。

以上形状的效果如下:
在这里插入图片描述

SVG文件基于xml,针对xml解析的python库较多,这里采用ElementTree进行解析。
Element 对象的常用属性:

  • tag:string 对象,表示数据代表的种类
  • attrib:dictionary 对象,表示附有的属性
  • text:string 对象,表示 element 的内容
  • child elements:若干子元素
    Element 对象的常用方法:
  • iter(tag=None):遍历该 Element 所有后代,也可以指定 tag 进行遍历寻找
  • findall(match):查找当前元素下 tag 或 path 能够匹配的直系节点
  • find(match):查找当前元素下 tag 或 path 能够匹配的首个直系节点
  • get(key, default=None):获取元素指定 key 对应的属性值,如果没有该属性,则返回default值。

解析流程如下:
将SVG文件传入ElementTree模块,获取xml树根。
先获取SVG图形宽高。
对xml树枝进行遍历,符合SVG图形的树枝,对于图形参数进行解析。

主函数如下:

def parser(svg_file):
    tree = ET.parse(svg_file)
    root = tree.getroot()
    width = root.get('width')
    height = root.get('height')
    if len(width) == 0 or len(height) == 0:
        print "width or height is 0"
        exit(1)
    if "mm" in width:
        width = width[:-2]
    if "mm" in height:
        height = height[:-2]
    print width, height
    for elem in root.iter():
        try:
            _, tag_suffix = elem.tag.split('}')
        except ValueError:
            continue
        if tag_suffix in svg_shapes:
            tag_suffix = tag_suffix.capitalize()
            print tag_suffix
            shape_class = globals()[tag_suffix](elem)

图形解析以矩形为例,需要获取矩形的起始点及长宽:

class Rect:
    def __init__(self, xml_node):
        self.xml_node = xml_node
        if self.xml_node is not None:
            rect_el = self.xml_node
            self.x = float(rect_el.get('x')) if rect_el.get('x') else 0
            self.y = float(rect_el.get('y')) if rect_el.get('y') else 0
            self.rx = float(rect_el.get('rx')) if rect_el.get('rx') else 0
            self.ry = float(rect_el.get('ry')) if rect_el.get('ry') else 0
            self.width = float(rect_el.get('width')) if rect_el.get('width') else 0
            self.height = float(rect_el.get('height')) if rect_el.get('height') else 0
            print("Rect: x=%f, y=%f, rx=%f, ry=%f, width=%f, height=%f"
                  % (self.x, self.y, self.rx, self.ry, self.width, self.height))
        else:
            self.x = self.y = self.rx = self.ry = self.width = self.height = 0
            print("Rect: Unable to get the attributes for %s", self.xml_node)

完整代码及SVG文件可从github下载:
https://github.com/ai2robot/svg_parser

#SVG到JSON一种将SVG字符串转换为JSON数据并可选地呈现统计信息的方法。 #Usage创建新实例,提供svg字符串,还可以选择传入options 。 var svg_json = new SVGToJSON ( svg [ , options ] ) ; #API ## Object.json SVGToJSON()返回一个对象。 OBJ.json是主要的JSON数据。 它是所有SVG标签的数组。 var svg_json = new SVGToJSON ( svg ) ; svg_json = { json : [ ... ] ## Object.json [I]中的每个标签Object.json有四个值。 var first_tag = svg_json . json [ 0 ] ; first_tag = { attrs : { # 打开文件 tree = etree.ElementTree(file=r'/home/260190/PycharmProjects/auto_svgtopdf/test.svg') # 保证每次操作均为原始model文件 root = tree.getroot() 元素查找方法 一、match为tag;不含嵌套,返回第一个/所有匹配的Element;可查找特定属性attrib[@id=“title1”]
文章目录1.SVG概述2.复数3.svgpathtools功能4.基本用法4.1.构造函数4.2.Path编辑4.3.读SVG4.4.写SVG4.5.point函数 1.SVG概述 SVG是一种图形文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高
以下代码需要nodejs环境,以及安装request-promise-native库,其实就是调用一个接口,任何语言环境都可以实现 const reqPromise = require('request-promise-native') const api = 'https://service-bk2c1l6z-1251215691.ap-beijing.apigateway.myqc... 注意:这个项目几乎已经死了。 但是,如果您喜欢这个想法,请尝试联系我,我们会实现它。 干杯! SVG l10n 助手 这个小软件主要面向翻译和处理SVG文件的 l10n 团队。 这可能对图表、信息图表、图表等有用。 主要(未来)功能包括: 将SVG文件解析为XML并识别 l10n 字符串 隔离字符串并创建某种目录,类似于 PO 文件 为翻译人员提供工作GUI ,可能类似于 poedit 根据目录文件创建无限数量的不同翻译 将翻译导出回SVG文件 软件依赖: Python 2.7 gettext(尚未实现) 任何 .po 文件编辑器(我推荐 poedit) 所需的 Python 模块: xml文件 elementtree(现在都在测试中,只有一个会存活下来) pprint(可选,仅用于测试目的) 当然,让自动化工具翻译一些字符串可能会导 /* 创建RsvgHandle对象 */ handle = rsvg_handle_new_from_file(argv[1], &error); if (error != NULL) { printf("Failed to load SVG file: %s\n", error->message); g_error_free(error); return 1; /* 获取SVG图像的尺寸 */ rsvg_handle_get_dimensions(handle, &dimension); /* 创建cairo_surface_t对象 */ cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, dimension.width, dimension.height); cairo_t *cr = cairo_create(surface); /* 渲染SVG图像 */ rsvg_handle_render_cairo(handle, cr); /* 保存图像到文件 */ cairo_surface_write_to_png(surface, "output.png"); /* 释放资源 */ cairo_destroy(cr); cairo_surface_destroy(surface); g_object_unref(handle); return 0; 上述程序首先创建了一个RsvgHandle对象,该对象表示要解析SVG文件。然后使用rsvg_handle_get_dimensions函数获取SVG图像的尺寸。接下来,创建了一个cairo_surface_t对象,该对象表示图像的绘制区域。然后使用rsvg_handle_render_cairo函数将SVG图像渲染到cairo_surface_t对象上。最后,使用cairo_surface_write_to_png函数将图像保存到文件中。最后,释放资源。