帮助:SVG

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
This page is a translated version of a page Help:SVG and the translation is 44% complete. Changes to the translation template, respectively the source language can be submitted through Help:SVG and have to be approved by a translation administrator.

ShortcutCOM:SVG

SVG文件格式的官方徽标

SVG可缩放矢量图形)是维基共享资源所接受的一种文件格式。其适合用于图表、地图,以及其他的非照片类图像。SVG在共享资源受到高度评价,因为其使用源代码来描述图形对象,因此目前其提供了修改与提升内容的最佳方法。

SVG文件在维基共享资源上已得到广泛使用。这里有一些入门指南(如果您已经知道要使用什么程序来生成此类文件,除以下内容外,还可考虑浏览Help:IllustratorHelp:Inkscape)。

什麼是 SVG?

一副SVG图像样例——请注意,无论您以何种比例查看图像,其线条始终显得平滑,不会出现“锯齿”

可缩放矢量图形(SVG)是一个XML规范以及文件格式,用于描述静态或动态二维矢量图形(与位图或栅格图相对)。它以纯文本或压缩(二进制)格式存储,这比其他多数图像格式(如JPEGGIF)具有更高的尺寸效率。SVG还允许嵌入栅格图形与可编辑文本。

librsvg

librsvg(或者“RSVG”)是MediaWiki使用的一个将SVG文件栅格化,成为维基共享资源网页所用的PNG位图格式的渲染库。共享资源页面显示的图像并非SVG,因此也不具有动画或交互效果。做出这一选择的原因之一是,实时渲染SVG会降低老旧计算机或操作系统的速度。可由SVG高效转换出来的栅格化版本有助于克服这一技术问题。另一个原因是一些SVG文件非常大(例如1 MB),一副在显示屏上显示为160×320像素的图像,如果不经压缩可达51200像素(24位色彩下可达153600字节)。

不幸的是,2014年之前librsvg的唯一维护者在一封私人邮件中写道:“librsvg的维护正处于深度冻结的状态,我主要是做一些次要漏洞修复的版本。”[1]多年来报告给GNOME的多数主要漏洞仍旧原封不动[2]旧网址。 最近librsvg有进行一些工作,但部分工作是将一些C语言代码更换为Rust编程语言。Librsvg-2.40.20预计是最后一个仅用C语言的版本;librsvg-2.41以及更高版本都要求Rust。[1] 尽管一个SVG的mask漏洞(Phab:T55899)可能已在librsvg-2.42.2版本中修复,但在维基共享资源能够兼容2.42及更高版本之前,该功能以及其他的修复都不可用。一位共享资源开发者称:“我们没办法在自己的Debian服务器上轻易将librsvg从2.40升级到2.42,因为2.42.x需要Rust。“(Phab:T193352,2018年4月29日) 。

librsvg一些漏洞和缺少的功能会影响共享资源上的SVG图像。因此,SVG文件力求解决或避免这些问题。例如,librsvg不支持路径文字的功能,并且对于从上到下的竖列文本方面也存在着问题。即使librsvg可以完美运行,也可能存在兼容性问题。SVG文件还可能会使用共享资源中没有支持的字体。

怪癖

樣式

在SVG規範中,style元素MUST默認其type屬性為"text/css"[2] 使用style元素的SVG圖像應在其‎<style>標籤中明確設置type="text/css"。(換句話說,‎<style type="text/css">應該優先於‎<style>。)(phab:T68672)

文本未能显示 / 浮动元素

参见§ 文本未能显示(浮动文字BUG)

systemLanguage processing

Private-use langtag qcs to select zh-Hans.
Private-use langtag qct to select zh-Hant.

RSVG does not correctly compare systemLanguage attributes, which SVG specifies is a comma-separated list of IETF language tags (langtag). RSVG only matches the first subtag (the group of characters before the first hyphen) in the langtag, so RSVG ignores the any country code or script subtags that follow. For example, RSVG will not distinguish zh-Hans (Chinese using simplified script) and zh-Hant (Chinese using traditional script). To work around that problem, a private-use langtag (one in the range qaaqtz) can be used to specify the language.

IETF langtag SVG markup
sr-Cyrl systemLanguage="sr-Cyrl ,qsc"
sr-Latn systemLanguage="sr-Latn ,qsl"
zh-Hans systemLanguage="zh-Hans ,qcs"
zh-Hant systemLanguage="zh-Hant ,qct"

As a further complication, as of May 2018, Google Chrome and Microsoft Edge browsers fail to handle systemLanguage attributes correctly, too. The first langtag should be the public langtag followed by a space. With that convention, both Chrome and Edge will parse the first langtag correctly (Chrome will incorrectly parse the second langtag; Edge only recognizes the first langtag and ignores all others). As of October 2018, both Chrome and Firefox fixed their systemLanguage matching; Edge still only recognizes the first langtag and ignores the remaining ones.

The systemLanguage attribute should be a list of IETF langtags. There is some confusion about proper language tags. For Serbian, MediaWiki has been using sr-EC and sr-EL, but under BCP 47 those tags mean Serbian as spoken in the region EC (Ecuador) and Serbian as spoken in EL (unassigned region). The proper langtags are sr-Cyrl and sr-Latn. The Cyrillic langtag should be before the Latin langtag to make SVG 1.1 switch processing choose the Cyrillic script if the user has stated a language preference that includes sr. (MediaWiki is starting to use proper langtags; see Phab:T117845.)

Chinese is more complicated. The zh is a macrolanguage subtag that references all Chinese dialects (e.g., Mandarin or Cantonese). One can specify Mandarin with zh-cmn, but the IETF registry[3] prefers the use of cmn. Similarly, instead of zh-yue, IETF prefers yue for Cantonese. The Chinese script may be specified: Hans is the simplified script and Hant is the traditional script. Which langtags to use for Chinese are not clear. A simple approach just uses zh-Hans or zh-Hant to specify the script (IETF registry marks both as "redundant" but does not offer a preferred alternative). An alternative specifies the dialect and script, for example, cmn-Hans or cmn-Hant. A region langtag can be appended: cmn-Hans-CN (Mandarin with simplified script as used in China).

For MediaWiki, the Serbian pages have a common source than can be rendered in either Cyrillic or Latin script. Similarly, the Chinese pages have a common source that can be rendered in either Hans or Hant. Ideally, a Chinese reader could select the Hans script, and all the images in the article would also be rendered in Hans. The desired effect would be something like

  • [[File:xyz.svg|lang=zh-hant|...]] for the zh-Hant reader and
  • [[File:xyz.svg|lang=zh-hans|...]] for the zh-Hans reader.

It is not clear whether or how this can be done in MediaWiki.

为维基共享资源创建SVG图像

你可以用来创建SVG图像的程序列在了后边的§ 编辑器章节。你也可以选择直接使用任何文本编辑器或IDE编写SVG代码。

以下各节解释SVG的特定功能。

上传之前:验证并检查图像外观

验证

尽管维基共享资源并未有硬性要求,不过最好是上传前用万维网联盟(W3C)的XML验证器(https://validator.w3.org)运行一下你的程序。验证器可以找到SVG文件中存在的于不同平台渲染出错的问题。例如,其会对flowText元素的使用报错,前者并非标准,也很少受到支持。不过验证文件通常不能证明重新上传是合理的,[4]对于例外情况,请见优化已上传的SVG

如果SVG文件有文档类型声明,验证器会使用它的文件类型描述(DTD)检查语法。如果没有文档类型声明(既不要求也不推荐),[5][6]验证程序可能会检查文件是否为格式正确的XML,但是它也可能意识到该文件是SVG,并通过将文件传递给nu验证器来执行非DTD验证。 在W3C验证器网页中,我们选择以SVG 1.1来验证文件。(在即将发布的SVG 2草案中将会移除对SVG DTD的引用)[7]

如果SVG文档中存在其他命名空间,验证器会报错。许多工具如Adobe Illustrator和Inkscape,都将节点插入到其他命名空间中。

通用前缀 命名空间 目的
cc http://creativecommons.org/ns# 权限和许可
cdml http://www.freesoftware.fsf.org/bkchem/cdml 化学图表
dc http://purl.org/dc/elements/1.1/ 元数据
i http://ns.adobe.com/AdobeIllustrator/10.0/ Adobe Illustrator
inkscape http://www.inkscape.org/namespaces/inkscape Inkscape
its http://www.w3.org/2005/11/its Internationalization Tag Set(ITS)
rdf http://www.w3.org/1999/02/22-rdf-syntax-ns# 资源描述格式
sodipodi http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd 图形
svg http://www.w3.org/2000/svg SVG
xlink http://www.w3.org/1999/xlink XML链接语言

If the W3C validator is given a file that is served with an appropriate Content-Type HTTP header, then the file will be validated as SVG 1.1+XHTML+MathML 3.0 (an option not available from the UI dropdown box). That validation is done by a second, more modern, validator, the nu Validator (https://validator.w3.org/nu). Additionally, the validation will not issue errors for the rdf namespace element trees and will use schemas to check the inkscape and sodipodi namespaces. The SVG 1.1+XHTML+MathML 3.0validation is used by {{ValidSVG}}.

Other namespaces will still cause validation errors. The W3C nu Validator can be told to suppress errors about other namespaces with the nsfilter parameter.[8]

In addition, non-SVG 1.1 attributes will produce validation errors. The SVG 2.0 draft allows users to include arbitrary data-* attributes just as HTML 5.0 does, but the W3C validator will complain about them.

See § Tagging SVG files for how to tag a file as validated.

图片外观

Different software programs and different browser platforms may render the exact same SVG file in slightly different ways. The way you see your final image in a vector image editor may not reflect how that image will look once it is uploaded to Commons and is viewed by others. Also, all SVG images are automatically converted to PNG files when used in a Wikipedia article, and this may affect how the final image looks as well. As an example of the former, in an image containing a series of very fine strokes, those strokes will probably look much more bold and thick in the editor than they will once the image has been converted to SVG and viewed in a web browser.

Those who create SVG files should consider saving their work in SVG format and then opening that same image using two or three different browsers to verify that it is rendering as intended. A similar check can be done by opening the file in other image editing programs as well.

To preview how an SVG will be rendered to PNG on Commons, go to Commons SVG Checker.

The reasons why the same file becomes rendered differently depending on context is a result of how these contexts (browsers or programs) interpret the file’s SVG code and use that code to generate the image. Aim to create a "least common denominator" SVG that renders correctly no matter what browser is used to open it, and never assume that your own image editing program is showing you what the image will really look like to other viewers. Previewing SVGs in a Web browser (rather than vector graphics editor) can reveal some problems. It is sometimes helpful in tuning and tweaking the SVG code, especially in conjunction with DOM Inspector tools.

Also, some programs will allow you to insert raster-based components into your file without warning you that if the file is converted into SVG these components will not simultaneously convert to vectors, meaning that you may need to be very careful about the sorts of filters and effects you include in an image and should check for any extraneous embedded "links" within an image before you upload the SVG to Commons. How to do this will vary from program to program.

However, if you are using Adobe Illustrator, here are examples of things which will cause Illustrator to convert a path into a raster component:

  • Any pattern applied to any fill, including patterns that are automatically included in Illustrator. You can sometimes work around this by converting any patterns you have used into rasters yourself, and then using the Image--> Trace function to convert these back into vectors.
  • Any path which contains more than one of Illustrator’s "Effects" — e.g., a fisheye warp and a freehand distort. Illustrator cannot handle two of these in the Appearance menu of any single path and will rasterize them.
  • Any path which has been altered with an Envelope-distortion. You can sometimes work around these in the same way you can work around the pattern problem mentioned above, but the results are usually disappointing.
  • Any path which has been assigned the Raster effect under the Effects menu. To retain these as vectors, you may only need to undo this effect.
  • Illustrator allows users to apply gradients to strokes in three ways: gradients within strokes, gradients along strokes, and gradients across strokes. However, only the first of these, gradients within strokes, is supported by an equivalent SVG code; any strokes containing gradients along or across them will be converted into rasters when the image is saved in SVG format.

These are just a few examples of things which will cause Illustrator to produce a raster when a vector was intended. The simpler these paths can be, the more likely Illustrator will be able to retain them as vectors.

For more information on how to check SVG files for MediaWiki, see § How SVG files work in MediaWiki.

文档声明

<?xml version="1.0" encoding="UTF-8"?>
<svg
 xmlns="http://www.w3.org/2000/svg"
 xmlns:xlink="http://www.w3.org/1999/xlink"
 version="1.1"
 viewBox="0 0 400 300"
>

The source code of every SVG file SHOULD begin with the XML processing instruction.[9] The XML processing instruction specifies the version of XML and the character set.[10] The W3C insists that character encoding declaration SHOULD be used,[11] (the W3C's validator warns only for its absence).

The software with which you create or edit the SVG file should provide the option of choosing character encoding. UTF-8 is RECOMMENDED for internationalization as opposed to ANSI or Unicode encodings other than UTF-8. The absence of the XML declaration will lead to a mild confusion when the SVG source file on a Wikimedia server is opened in a browser: the raw XML code will be displayed instead of being rendered into an image. This is not an issue if you download the source SVG file to your device and open it locally.

A DOCTYPE declaration with its DTD is not needed and it is official not recommend to use a DTD,[6] but neither it is recommended to not use a DTD. SVG 1.0 and SVG 1.1 have DTD specifications, but SVG 2.0 will not have one. The SVG DTD will validate the SVG, but the DTD is not aware of any extensions. Consequently, a DTD validator will list as errors RDF metadata and the additional elements and attributes that Inkscape includes with its SVG output. Wikimedia servers also restrict what can be included in a DTD's internal subset, so it is no longer possible to extend the SVG DTD to include additional elements and attributes.

The svg root element should follow. It MUST specify the XML namespace for SVG, xmlns="http://www.w3.org/2000/svg";[12] without the SVG namespace, an SVG image will not render. (The default namespace is specified with xmlns.) Other namespaces may be included in the svg element. For example, if the file uses linking,[13] then the xlink namespace xmlns:xlink="http://www.w3.org/1999/xlink" should be declared.

The SVG version number SHOULD be included (typically 1.1). Software normally supplies these namespace declarations and may include other namespaces.

The defaults for the width and height attributes are "100%", and those defaults will permit automatic scaling. An image that specifies width="400px" is declaring that it wants to be displayed at a size of 400 pixels instead of neatly filling its container. Unfortunately, many software tools specify a fixed size for these attributes. The svg element should specify a viewBox[14] attribute. The view box specifies the displayed portion of the image; the view box is translated and scaled to fit the width and height of the container.

位图

SVG文件中的位图图像会有一些有价值的用途,比如注解照片(例如,在解剖图照片中标注部位)。然而,SVG文件中多数位图都没有必要使用,可以重画或转为矢量图将其换掉。如果出于某种原因,位图是最好的解决方案,那就应当将其包含在SVG文件中;但是,如果生成的矢量图总体上更好或更有意义,则应将其重新绘制为矢量图。而且,其他浏览到这张图像的共享资源编者可能会决定给包含不受欢迎的基于栅格元素的SVG图像添上{{BadSVG}}标记。

在SVG文件中使用位图时还需三思,可以考虑将它们转换或者重画为矢量图再将它们合并到图像中,而非直接将位图包含其中。可在讨论页进一步讨论这个话题。如果你决定使用位图图像,请确保使用“嵌入”而非“链接”图像,否则其将无法渲染。

动画

SVG图像也可以动,但由于维基媒体项目中,SVG被转化为PNG栅格格式使用,因此只有浏览器加载了SVG文件之后才会有动画效果。在条目页面中,需要单击图像到达File:页面,再点开图片以加载SVG。

在过去,让SVG具有动画效果的方法是使用SMIL。最近,CS也支持了动画效果。

各浏览器对SMIL的支持正在不断减少。Internet Explorer不支持SMIL;2015年,谷歌不再推荐使用,并有可能在未来将其从Google Chrome浏览器中完全删除。[15]截至2018年7月,除了Internet Explorer、Edge和Opera,多数浏览器均支持SVG SMIL动画。[16]

参见§ 标记SVG文件一节了解如何标记有动画效果的SVG文件。

标题

The title element right under the SVG element serves as the title name of the SVG image itself, but it can be also applied further inside of the descendant elements within the SVG image. Most modern desktop browsers render these titles into popup tooltips which help readers to identify the meaning of the object on mouse-hover even if there is text label by the object.

Similarly, title can also be applied on text too for collapsing message but it may be a good idea to give some hint of the existence of the title element by using text decoration like underline. XML comment is more suitable for technical information which should not be displayed to the reader normally but other users who may edit the SVG source code.

Currently most mobile browsers can not display any title content innately except for the one right under the SVG element because there is no equivalent of hovering the pointer on mobile devices.

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 50 50">
	<title><span lang="en" dir="ltr" class="mw-content-ltr">Title of the whole SVG image</span></title>
	<g id="shapes">
		<title><span lang="en" dir="ltr" class="mw-content-ltr">Title of the "shapes" group</span></title>
		<rect x="0" y="0" width="10" height="20" fill="#f00">
			<title><span lang="en" dir="ltr" class="mw-content-ltr">Title of the rectangle</span></title><!--XML comment-->
		</rect>
		<circle cx="5" cy="5" r="3" fill="#0f0"/>
		<text x="2" y="30" text-decoration="underline"><span lang="en" dir="ltr" class="mw-content-ltr">Text</span>
			<title><span lang="en" dir="ltr" class="mw-content-ltr">Title of the text</span></title>
		</text>
	</g>
</svg>

被禁用的元素与脚本

出于安全原因,MediaWiki并不接受SVG文件内嵌以下的模式:

<!--not whitelisted namespaces-->
xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
xmlns="http://www.w3.org/1999/xhtml"
xmlns="http://www.example.org/notsvg"
xmlns="http://example.org/notsvg"
xmlns:bd="http://example.org/ExampleBusinessData"
<!--no external content-->
xlink:href="../resources/SVGFreeSans.svg#ascii"
xlink:href="animate-elem-09-t.svg"
xlink:href="url(#testPattern)"
<image xlink:href="http://example.org/image.jpg"/>
<d:testDescription href="http://www.w3.org/TR/SVG11/styling.html#StylingWithCSS">
<image xlink:href="data:image/svg+xml;base64,"/>
<!-- attributeName -->
<set attributeName="xlink:href"/>
<animate attributeName="xlink:href"/>
<set xlink:href='#s'/>
<set attributeName='xlink:href'/>
<!-- css -->
@import
url("../images/selector-types-visibility-hidden.css")
url(woffs/embeded-text-text-05.woff)
<!-- scipts -->
<script></script>
<!-- interactive -->
onactivate=""
onbegin=""
onclick=""
onend=""
onfocusin=""
onfocusout=""
onload=""
onmousedown=""
onmousemove=""
onmouseout=""
onmouseover=""
onmouseup=""

To sanitize problematic svg-files, you can use https://svgworkaroundbot.toolforge.org/ (enable santicize potenitally dangerous commands), more details can be found at User:JoKalliauer/IllegalSVGPattern.

Due to limited abilities, the XML-Parser does not recognize and block the following patterns:

<!--ATTLIST-->
<!DOCTYPE svg [
<!ATTLIST bar id ID #REQUIRED>
]>
<!--ENTITY with more than one element-->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd" [
  <!ENTITY Smile "
    <rect x='.5' y='.5' width='29' height='39' fill='black' stroke='orange' stroke-width='2'/>
    <g transform='translate(0, 5)'>
      <circle cx='15' cy='15' r='10' fill='yellow'/>
      <circle cx='12' cy='12' r='1.5' fill='black'/>
      <circle cx='17' cy='12' r='1.5' fill='black'/>
      <path d='M 10 19 L 15 23 20 19' stroke='black' stroke-width='2'/>
    </g>
  ">
  <!ENTITY Viewport1 "<rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>">
  <!ENTITY Viewport2 "<rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>">
]>

外部文件

在保存SVG图片的最终版本之前,你应当移除对用于制作SVG的其他文件的所有引用(这就是“链接”的含义);如果这些引用遗留在SVG文本中,渲染时会因为找不到外部文件而失败。维基媒体屏蔽了此类上传,因此无法再上传它们。

清理

删除或“清空”所有未使用的定义(def)也是不错的想法,因为它们会无谓地增加文件体积(除非进一步的编辑还将用到它们,例如作为底板)。

有三个通用的优化程序:scoursvgcleanersvgo,但请注意,这三个优化程序都有许多打开的错误,并且不再积极开发,它们的使用方法请见《使用优化程序

但请注意清理工作是具有争议的,且通常是所不希望的,参见《什么时候优化/验证文件是所不希望的?》获得更多细节与原因。清理或验证并不能证明重新上传是合理的[17]。不合规范的元素和属性通常是正确渲染的必要条件,因此不应删除[18]

纯SVG、压缩的SVG,通用规范

Inkscape和其他程序也允许用户将文件保存为SVGZ格式(压缩的二进制SVG)。该格式不受共享资源支持,任何上传至此的图像都不应当采用。这类图像无法被上传。

请注意在Adobe IllustratorInkscape中保存文件的选项不同,参见Help:Inkscape#Inkscape_SVG_vs._Plain_SVGHelp:Illustrator#How_to_save_as_an_Illustrator_SVG。 在Inkscape中有三种可选的SVG格式:“Inkscape SVG”、“纯 SVG”和“优化的 SVG”。若要在Inkscape中再次编辑文件,Inkscape SVG是的最佳文件格式,否则诸如图层或网格之类的信息将被移除,这类图像应当以{{Created with Inkscape|IMPORTANT=yes}}标记表面它们不应当再优化。纯SVG的渲染效果与Inkscape SVG相同,但文件体积要小一些。优化的SVG使用了名为scour的优化程序,它可以进一步压缩文件体积,并为librsvg的漏洞(如phab:T217990[19])提供了一些解决方法。

字体、文字

维基媒体服务器上安装的诸多自由字体可以使用<text>标签来呈现。你可以在元维基上的渲染样例原始列表中找到它们。但是Web字体完全不受支持。一些字体的常规字形不可用,而只支持黑体或其他(如斜体);可以考虑使用替代字体如Liberation(注:不适用于中文)。请考虑使用这些字体而非将文字转化为路径,原因如下:

  • 保存为字体而非路径文字可以显著降低文件总体大小,尤其在图像中包含大量文本的情况下。
  • 其他编者可以无需重绘全部文本,即可修正图像中的文字或语法错误。
  • 文本可以轻松地被翻译成其他语言,省去贡献者本地化的时候再次放置所有的文本标签的麻烦,这是很重要的品质,因为维基共享资源是一个多语言项目。路径文字需要更多的翻译工作。另见Template:Translate
  • 文本易于被搜索引擎找到,而路径轮廓文字可能无法被后者识别。

此外,如果字体被转化为路径文字,若没有可接受的自由授权,则可能会出现版权问题(例如矢量图像为字体的衍生作品)。另见:WP:公有領域#字体

那些不应当将文字转化为路径图形的图像可能会使用{{Path text SVG}}标记,如要链接一个SVG文件的文本可修改(我们一直说的“文本”或“字体”)与文本不可修改(例如基于路径)的版本,可使用{{Vector text versions|…}}

Demonstration of the basic steps of preserving the text before converting to path in Inkscape so the text can remain selectable (when opened in real-time in browser) and searchable (by search engine like Google).

If you still insist converting text to path for reasons like the lack of support of textPath function or rare glyph which is not present in most typefaces, you should duplicate the raw text group to overlap the converted text and add the attribute fill-opacity="0" stroke-opacity="0" to this group in order to hide the raw text. This way the text in the original SVG file can still be searched, clicked and highlighted by readers manually. opacity="0" may lead to some misunderstanding because it will make the highlight invisible while still selectable. display="none" prevents readers from searching the text without accessing the source code.

Converting text to outline (path) before exporting SVG is particularly popular among Adobe Illustrator users because the vector graphic software does not convert text-align attribute to text-anchor and the fallback fonts on Wikimedia have different font metrics than the chosen font by the image contributor. This leads to incorrect text positioning and encourages users to ignore the benefits of maintaining raw text in the vector file.

文本未能显示(浮动文字BUG)

System-search.svgSee also:§ Line wrap

Inkscape supports a feature known as "Flowed Text" which automatically wraps text to fit into the bounds of a given text box. Unfortunately this feature is part of SVG Tiny 1.2, which nobody supports. Its usage will almost certainly result in compatibility problems.[20] On Wikipedia, a flowed text box does not render at all (phab:T43424 – depending on font size and color).

[21]

为避免Inkscape中的这一问题:

  • 最简单的解决方法是只用单击而非拖动来以Inkscape的文字工具创建文本。(相较而言,按住并拖动鼠标来绘制文本框时,你这是特意告诉Inkscape使用“浮动文本”。)

不过也有一些简单的方式来解决这个问题:

  • 如果已经创建了浮动文本框,你可以使用文字→转换为文字来将其转化为一般的文本[22]。(但之后请检查文本对齐,在约15%的案例中[23],其转换了文本但是改变了文字对齐[24]。)
  • 对于只由一行文字组成的浮动文本(超过九成的案列),你可以使用任何文本编辑器将浮动区域替换为<text x=".." y="..">标签(矩形的x、y坐标),从而将其转化为简单的文本(可生成与Inkscape完全相同的效果)。在User:JoKalliauer/RepairFlowRoot#replace_the_flow-text_by_<text>_using_(Text-Editor)你也可以找到自动字符串编辑脚本[25]帮你完成这一工作。

如果你意外创建了空的浮动文本框(例如未包含文本的),其在Inkscape中无法看到或选中,但在维基百科中仍会显示为一个黑色矩形。如要删除它,有一些可能的方式:

  • 使用Inkscape内建的XML编辑器(编辑 → XML 编辑器)删除所有的浮动文本框(树形视图中所有名为<svg:flowRoot id="flowRootXXXX">的节点)。
  • 使用简单的文本编辑器(如Notepad)搜索文字"flowRoot"。通过移除XML开始标签(<flowRoot ...>)、结束标签(</flowRoot>)以及对应两个标签间的所有文本,来删除浮动文本框。[26]
  • 如果只是隐藏不可见的矩形,你可以添加 fill-opacity="0"[27][28]<rect … fill-opacity="0"/>标签(或<path d="…" fill-opacity="0">标签)中。

文本转换限制

SVG原始文本渲染与转换为路径文本的比较

Font scaling currently does not work as expected if horizontal and vertical scales (according to the effective transform matrix) are not equal (the horizontal stretch will be ignored: only the font height, computed from the matrix is currently honored); this can prevent the correct rendering in narrow/condensed or width-extended styles from another font, with text taking unexpected width and flowing out of the expected box (the alternative is to select an alternate free font family which is already narrowed/condensed).

Text is guaranteed to be misplaced (and in some case, ugly kerning) if the resolution of the PNG render is not the same as the native dimension defined by the SVG file itself regardless of how "regular" the scaling multiplier is (e.g. 0.5, 2 or 4) (phab:T36947).[29] In any case, do not use extremely small (>10px) or large font-size and then scale the text or the whole image to your desirable size. Always begin with a reasonable font-size (unfortunately a size around 80px is preferable).[30]

Beware also with font metrics differences: an SVG file may look good when rendered directly in a SVG-capable (all modern) browser under Windows or Mac OS (which can use common, but non free fonts such as Courier or Courier New), but will look other when restricted to the list of free fonts currently supported by the MediaWiki’s SVG-to-PNG renderer (or when viewed under OSes like free distributions of Linux), see also section "Font substitution and fallback fonts".

The attribute textLength isn't fully supported and could not rendered correctly. See phab:T15387.[31]

字号较小时字符对齐出错

Librsvg不能准确计算字号小于等于20px时的字符间距。

对于像这样的文本

<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
 <text x="20" y="30" font-size="5px">样例文本</text>
</svg>

你可以将其替换为:

<svg viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg">
 <text x="200" y="300" font-size="50px">样例文本</text>
</svg>

或者是换成

<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
 <g transform="scale(0.1)"><text x="200" y="300" font-size="50px">样例文本</text></g>
</svg>

书写模式限制

中文图表可能适合从上到下的书写模式,但事实上在librsvg中这样会出现异常……

RSVG recognizes writing-mode property, but does not implement it correctly. When this property is given any non-default value (i.e., anything but left-to-right modes), all characters will clump together (phab:T65236). For example, the typical way of producing vertical text does not work:

<text x="50" y="50" writing-mode="tb-lr" font-size="15px">東涌綫</text>

如果确实需要替代的书写模式(例如亚洲语言的从上到下模式),请单独对齐所有字符,而不要依赖使用这个属性:

<text transform="translate(50,50)" font-size="15px" text-anchor="middle"><tspan x="0" dy="16"><tspan x="0" dy="16"></tspan></tspan></text>

The above code lays out a horizontal text string (writing-mode is unchanged from the default left-to-right) one character at a time; each character is reset to the same horizontal position (x=0) and escaped 16 units (dy=16) further down the page. The text-anchor="middle" simulates dominant-baseline="central", which is the auto default when writing-mode="tb".

Font substitution and fallback fonts

How the fallback-fonts are rendered.

SVG font specifications may use a specific font family such as Arial or Times New Roman. Such a font specification usually means the user agent must have access to the font file with that name. Unfortunately, many fonts are proprietary and are not available on all operating systems. For example, not all operating systems have the proprietary Arial font. If the specific font family is not available, then some default font will be used; the default font may have a much different appearance. For the user agent librsvg, the default font is Liberation Serif.

Many user agents have a font substitution table that allows the user agent to substitute a font family that is close. To improve the font matching, SVG allows the font-family to be a list of font family names; the user agent will use the first font family that it recognizes. The graphic artist might list similar Microsoft, Apple, and Unix fonts to improve the chance of the user agent having the desired font. Additionally, SVG supports the CSS generic font family specification.[32][33] That means most SVG user agents should support the generic font families of serif, sans-serif, cursive, fantasy, and monospace. It is good practice to use a generic font family as the last entry in the font family list. For the librsvg on Commons:

  • sans-serif maps to DejaVu Sans
  • serif maps to DejaVu Serif
  • cursive maps to the uninteresting DejaVu Sans
  • fantasy maps to the uninteresting DejaVu Sans
  • monospace maps to DejaVu Sans Mono

On Commons, librsvg has the fonts listed in m:SVG_fonts#Latin_(basic)_fonts_comparison. Using just those fonts will get good results in Wikipedia articles that display their images using librsvg, but graphic artists should also be aware that SVG files may be displayed by other user agents. Consequently, it is best to use common font families (such as Arial) or a list of font families that ends with a generic font family (such as Trebuchet, sans-serif).

The font metrics for generic font families such as sans-serif will likely vary widely on different user agents. In graphic illustrations metric exact text elements are often important and Arial can be seen as de-facto standard for such a feature. Adding both Arial and sans-serif as fallback fonts will help the SVG to be displayed with best effort on machines that do not have or substitute Arial. To make the SVG file independent of Arial, change all occurrences of font-family: Arial to font-family: 'Liberation Sans', Arial, sans-serif.

If you are using non-Western characters, you should define those typefaces preceding Liberation Sans. For example, if your text contains Chinese characters, font-family definition should be: ‘ Liberation Sans, Arial, WenQuanYi Zen Hei, SimHei, sans-serif’. In this case, western fonts are put in the front because the quality of Western characters in Chinese fonts is often low, and we want to use the higher-quality ones first.

  • Inkscape begins supporting fallback fonts from version 0.91.
  • Adobe Illustrator version 18.1.1 or earlier (probably in later versions as well) does not support fallback fonts, so the SVG file has to be manually updated in a text editor after it is saved.
defined font Wiki-fallback possible fallbackdefinition, which look similar (works on Wikimedia/Windows/Linux/Mac)
[-no definition-] Liberation Serif
serif DejaVu Serif[34]
Times New Roman Liberation Serif font-family="Liberation Serif,Times New Roman,Times,Times-Roman,serif"
sans-serif DejaVu Sans[34]
Arial Liberation Sans font-family="Liberation Sans,Arial,Nimbus Sans L,Helvetica,sans-serif"
Helvetica Nimbus Sans L font-family="Nimbus Sans L,Ubuntu,Liberation Sans,Helvetica,Arial,sans-serif"
Calibri font-family="Liberation Sans,Carlito,Calibri,Segoe UI,Myriad,UnDotum,Optima,Tahoma,Arial,sans-serif"
Courier New Liberation Mono font-family="Liberation Mono,Courier New,Courier,monospace"
monospace DejaVu Sans Mono
[-everything unknown-] DejaVu Sans

Layout with text and tspan elements

Although you can use only the text element to render simple text in the image, the tspan element can be useful to handle text which the position of the word is dependent to the other.[35] A tspan element must be nested within the text element, and then more tspan can be nested within this tspan, all styling defined in the parent text element will be inherited by its child tspan elements. For example:

<g font-size="12px">
  <text font-weight="bold" x="10" y="10"><span lang="en" dir="ltr" class="mw-content-ltr">Wikipedia hosts knowledge</span>
    <tspan fill="blue"> <div lang="en" dir="ltr" class="mw-content-ltr">
contributed
      <tspan text-anchor="end" dy="12"> by volunteers</tspan>
</div>
    </tspan>
  </text>
  <text font-style="italic" x="15" y="30"><span lang="en" dir="ltr" class="mw-content-ltr">Wikimedia Commons hosts free media files for all sister projects.</span></text>
</g>

The primarily difference with the "g nesting text" structure is that few important text layout behaviors are exclusive to tspan: When multiple text elements are lined up consecutively, they still position themselves independently; if multiple tspan elements are lined up consecutively but the second and subsequent tspan elements are not given absolute x coordinate, text of these tspan elements will line up horizontally right next to the end of the character of prior tspan in the same text element.

However, tspan should be used sparingly even if you define the absolute x coordinate for every single tspan element in the text element. This is because under the default xml:space definition, any line break (within text or tspan) with an extra trailing white-space is converted to a blank space character automatically.[36] If there happens to be multiple consecutive line breaks, they are treated as one space still. This would not be a problem if the line break is followed by a tspan element with absolute x coordinate and is align to left (text-anchor=start, the default value). If xml:space is given the 'preserve' value, librsvg will translate the indent to a long white tab character equal to 8 space characters. Because the auto-formatting or re-indentation (indent style) of most XML editors creates indent for every new descendant XML tag automatically, use re-indentation carefully if your SVG file contains such usage of tspan.

The behaviors in different SVG renderers to this issue varies much and is usually inconsistent to the W3C specification (also the 'preserve' value of xml:space will be deprecated in SVG 2.[37]). The only problem with librsvg is that it never converts the line break alone into space no matter which value of xml:space is given if there is no trailing space or indent before the tspan tag. Except for librsvg, nearly all modern browsers always add the converted space character right after the preceding text, this is the reason why the end or middle values of text-anchor property always align the text 1 space leftward because the new line and/or the trailing tab or space after the closing tspan tag is converted to an unexpected space character.[38]

Re-indentation XML Code Result
Before
<text>
  <tspan>O</tspan><tspan>n</tspan><tspan>e</tspan>
</text>
One
After
<text>
  <tspan>O</tspan>
  <tspan>n</tspan>
  <tspan>e</tspan>
</text>
O n e

Inkscape is buggy to render tspan, for example, inheriting text-anchor property from the first tspan element incorrectly for the subsequent tspan elements even if the property is specifically given a value in all tspan elements.[39] In such case, simply revert the "text nestling tspan" structure to just "g nestling text". Inkscape also defaults to xml:space="preserve" to deal with space between tspan. If you are completely concern with how your SVG appears in Inkscape but prefer the default xml:space handling, use &#160; to replace each general space so it will not be hidden in Inkscape.

If you are generating an SVG using Adobe Illustrator, you will be given options to "Output fewer <tspan> elements" and "Use <textPath> element for Text on Path" during the save dialog. To maximize the consistency of the appearance of your font across browser platforms, you should place a check mark next to the former and make sure there is no check mark next to the latter. If you do not do this, the kerning of some of your letters may cause them to overlap (depending on your browser).

自动换行

SVG 1.1 未提供任何形式的自动换行(无论软回车还是硬回车)。所有的自动换行都需要手动重新放置texttspan元素,x绝对坐标不变,更换新的y坐标。对于tspan元素,可以用dy属性设置下一行的y坐标。虽然textPath也可以处理相同的状况,[40]但其未被librsvg/维基媒体支持(phab:T11420)。

SVG 1.2 的一份草案确实解决了自动换行问题,但此方案很少受到支持。

SVG 2.0 草案也解决了自动换行的问题,但是截至2018年5月,Chrome、Firefox、Edge浏览器和librsvg都尚未支持。

字重值

phab:T207506所呈现的效果

你可以使用font-weight属性改变文本的粗细。 W3 SVG 规范中称默认值为normal[41]例如,粗体和细体都未使用的情况,但是librsvg无法识别此特定值。如果你想要将文本还原为标准(normal)字重,但是父元素中已经定义了字重,请使用数值400而非normal

Font styling class

Usually it is simply gratuitous use of the ‘style attribute’. To ease the process of updating font-family for every text or tspan elements, you can define the font CSS class(es) within ‘style element’ and apply the class property in elements like this:

<style type="text/css">
text {font-size:12px; font-family:Liberation Sans, Arial, sans-serif} <!-- <span lang="en" dir="ltr" class="mw-content-ltr">General font styling</span> -->
.small {font-size:9px}
.special {fill:#f93500; font-weight:bold}
.title {font-size:14px; font-weight:bold; font-family:Liberation Serif, Times New Roman, serif}
.italic {font-style:italic}
</style>
<text class="title" x="10" y="20">Qridfs</text>
<text x="10" y="30">Rfnkl fgkj qljf fgk gskla</text>
<text class="small">
  <tspan x="15" y="40">Dfj fdmnkl</tspan>
  <tspan x="15" dy="12" class="italic">Akgfld fkdngf mna</tspan>
</text>
<text class="special" x="10" y="60">Tcjgh xlij qpfj</text>

CSS class defined in ‘style element’ can also be used for other SVG elements (e.g. g and path) despite the misleading type="text/css" attribute. Even if one particular style is defined once in the SVG, it is still advised to replace the style with class for a tidier layout of XML codes.

Contrary to popular belief the style attribute does not separate content from presentation, and unless you need to override properties set by a CSS selector, it is best to use the SVG formatting attributes instead (e.g. <path fill="#fff" stroke="none"/> instead of <path style="fill:#fff;stroke:none"/>).[42] However, if you need to override the element style defined in style element, you do need to employ style attribute. If you need to override the style for text element without style attribute, you can use a tspan element container to nest the text you need to override the style, presuming there is nothing predefined in style element for tspan element.

Note
  • phab:T68672 – CSS style element get ignored if the default value type="text/css" is omitted.
  • phab:T43423 – CSS child selectors are not supported by librsvg.
  • phab:T68551 – CSS classes on text elements get not inherited on child tspan elements. If you want this, you need to add a separate class for tspan as well, or use simply groups (but not in the text element as it Scour unfortunately does).

Text with background edge

Text background edge.svg

Sometimes the text might be unreadable because the background color has low contrast with the font color or the pattern is too complicated that confuses the reader. This can be solved by duplicating the text in exactly the same position, but the back text rendered with stroke and the fore text without it like this:

<text style="font-size:12px">
  <tspan x="10" y="20" style="stroke:white; stroke-width:3px; stroke-linejoin:round;"><span lang="en" dir="ltr" class="mw-content-ltr">Placeholder</span></tspan>
  <tspan x="10" y="20"><span lang="en" dir="ltr" class="mw-content-ltr">Placeholder</span></tspan>
</text>
  • "stroke-linejoin:round" is defined to avoid sharp corner of the text stroke.

The problem with applying stroke and fill to the same text element is that the stroke will be rendered over the main body of text, making it otherwise unreadable if the font is too small but requires a larger stroke to be distinguishable from the background.

SVG filters can be used to draw the text over a dilated version of the text. The filter first expands the text, sets the color of the expanded text, and then draws the original text over the dilated version. One filter can be defined, and that filter can be used by several text blocks:

<filter id="textBack">
  <feMorphology in="SourceAlpha" operator="dilate" radius="1" result="bloom" />
  <feFlood flood-color="white" flood-opacity="1" result="flback"/>
  <feComposite in="flback" in2="bloom" operator="in" result="surround" />
  <feMerge>
    <feMergeNode in="surround" />
    <feMergeNode in="SourceGraphic" />
  </feMerge>
</filter>
<text x="10" y="50" filter="url(#textBack)">gibberish</text>
<text x="10" y="70" filter="url(#textBack)">more gibberish</text>

SVG filters can also be used to size an opaque rectangular background that surrounds the text. Using a filter is more robust than painting a rectangle and then painting the text on top of that rectangle. A fixed-size rectangle may not fit the font used for the text; the size of the rectangle would also need adjustment if the text changes. If the text is translated, for example, the rectangle may need to be changed. Using a filter automatically adjusts the size.

<filter id="rectBack" x="-2%" y="0%" width="104%" height="100%">
  <feFlood flood-color="white" flood-opacity="1" result="rect"/>
  <feMerge>
    <feMergeNode in="rect" />
    <feMergeNode in="SourceGraphic" />
  </feMerge>
</filter>
<text x="10" y="50" filter="url(#rectBack)">gibberish</text>
<text x="10" y="70" filter="url(#rectBack)">more gibberish</text>

Outlining text can be done without filters by explicitly rendering the text twice. The first time, the text is rendered with a white stroke to set the outline. The white outline erodes the text. The text is rendered a second time, but this time the text is not stroked. Consequently, the characters are rendered full size (without erosion).

If you have lot of text that needs to be rendered with a stroke background, you can manually include the text within <g>, <text> and <tspan> elements. The <g> element which will be rendered underneath, apply the stroke, then <use> the text group of <text> element without a stroke and fill the font with contrasting color:

<g style="stroke:white; stroke-width:3px; stroke-linejoin:round">
  <text id="text_group" style="font-size:12px">
    <tspan x="10" y="80"><span lang="en" dir="ltr" class="mw-content-ltr">Placeholder 1</span></tspan>
    <tspan x="10" y="95"><span lang="en" dir="ltr" class="mw-content-ltr">Placeholder 2</span></tspan>
  </text>
</g>
<use xlink:href="#text_group" style="fill:black; stroke:none"/>

W3C includes paint-order property in SVG 2.0 which allows the order to render the attributes of "fill", "stroke" and "markers" within one element arranged by the user manually, instead of following the default mandatory order.[43]

Mozilla Firefox also includes this attribute experimentally but it defaults to disable in the stable release until SVG 2.0 matures. This feature can be enabled in the about:config entries of Firefox.[44]

渐变色

火狐浏览器未能正确渲染的一个样例

Users of Inkscape version 0.46 may notice that images with "Fill gradients" display perfectly on Inkscape, but display "messed up" in Opera or Firefox browsers. One possible cause is that the last "stop" on a gradient has opacity set to 0. Inkscape appears to ignore this last stop, but both Firefox 3.0.6 and Opera 9.36 will render it as a white border in the filled object. Solutions are either remove the last stop (because it was probably created in error) or change the opacity (and colour) so that the image renders correctly in browsers.

Users of Adobe Illustrator CS5, CS6, or CC and who also use Firefox may notice that an Illustrator "symbol" containing a gradient will render normally as a Commons PNG file but if the SVG file itself is opened in Firefox these symbols will appear vacant. Other browsers will have no difficulty— Google Chrome, even Internet Explorer will render Illustrator’s SVG symbol gradients correctly, but because of a known bug that the designers of Firefox have been aware of since 2005 (Mozilla’s Bugzilla bug 376027 and other reports that lead to it such as bug 353575) but have so far failed to adequately fix, Firefox will display such symbols as empty shapes (symbol strokes and symbol paths without gradients are unaffected).

Adobe Illustrator users should also note that any Illustrator "symbols" containing paths with both a gradient and a filter will be rendered as a PNG in Commons only within the first instance of the use of that symbol. Subsequent use of a symbol containing these paths will render the paths (though not the entire symbol) as blank (neither gradient nor filter nor fill nor stroke will be applied).

Blurring

Comparison of gaussian blur filter effect between Google Chrome and Wikimedia. (Source SVG file)

Wikimedia’s SVG renderer currently supports various filter effects, but some effects such as gaussian blur (feGaussianBlur) behave differently when the blurred object exceeds the edge of the actual image. The current version of RSVG will treat the cropped edge as the actual edge of the object to apply the effect (as if the object has applied clipPath before applying filter effect), creating an undesirable filter effect against the image edge.

文件尺寸

减小文件体积

如果文件太大,请通过以下方式来压缩、优化:

翻译

SVG文件可以直接翻译,也可以是多语言嵌入式翻译。更多信息请参见 Commons:Translation possible/了解更多.

转换为SVG

System-search.svgSee also:Commons:Media for cleanup

给出一个图像文件但格式不是SVG,有多种方法将其转换为SVG,见§ 转换器章节的程序。

注:对于由第三方进行矢量化的矢量图像,存在一个问题,即哪怕所描述的图像本身没有版权或是低于原创性门槛,矢量化代码自己也可能拥有版权。更多信息请参见§ 版权一节。

Generally, there are 3 ways to produce an SVG file, given an existing image:

  1. Regenerate it
  2. Convert it
  3. Create a new one

If you are unable to convert an image yourself, please add the tag {{Convert to SVG}} to flag that the image should be converted. Some images are not well-suited to SVG, notably continuous-tone images such as photographs. These generally should instead be stored as JPG.

Regenerate it

If the image was generated by a program (rather than drawn by hand) — for example, a chart from a spreadsheet — it may be possible to set the output format to SVG, rather than PNG or other format, and thus produce an SVG image from the same source. If possible, this is generally easiest.

Convert it

Many vector file formats can be easily converted to SVG simply by changing the format (repackaging the existing data), by using a converter program. This may be as simple as opening the file in a vector image editor and then saving it in SVG.

For raster (bitmap) graphics, this cannot be done because the image is a set of individual pixel values, not a set of strokes (vectors). For these images (notably PNG images), one can convert to SVG via "vectorization" or "tracing" — automatically generating a vector graphic from a raster image.

Many SVG editors have tracing functions, and dedicated converters exist. In Inkscape, this is done by the potrace program.[48][49] Concretely: open the bitmap (File → Open… (Ctrl-O)), then select Path → Trace Bitmap… (Shift-Alt-B). There are various options; after using, please delete the underlying bitmap, and consider simplifying the path to reduce the number of nodes (Ctrl-L).

Adobe Illustrator also allows for the conversion of bitmap images into vectors via its Image Trace function. Care must be taken when doing so that the resulting vector image is neither ponderously large (often the result of too much conversion fidelity with regard to color and shape) nor so simple that it loses faithfulness to the original image. Converted images almost always require some manual correction after conversion. As in Inkscape, the underlying bitmap should be removed after conversion is complete.

It should also be noted that when Illustrator converts one of its files into an SVG file, it tends to convert a number of shading effects such as "inner glow", "outer glow", and gradients applied along or across a path into undesirable raster images which it then embeds in the SVG image using links. Such embedded images can often be immediately detected by viewing the image in a web browser under high zoom where they will appear cloudy or have visibly jagged edges (neither of which is ever true of a correctly rendered vector image). As these effects were originally created without regard to the W3C consortium, Adobe does not offer and is never likely to have a solution to the problem.

In order to remove raster components from an Adobe Illustrator-generated SVG prior to uploading the image to Commons, the artist must first be able to identify where Illustrator has put them. This can be done in the following way:

First finish editing an image file and save in Illustrator’s AI format (*.AI), then save it again in SVG format. During the second Save dialogue, choose to "embed" the links (for now). Then close out the image (File=>Close or Ctrl+w). Next, open the SVG version back up again, click on "Window" from the right side of the top menu bar, and scroll down to "Links". This will open up a small window containing information about each of the links (if any) which currently exist in the SVG image (whether or not Illustrator produced them). You can click any of the entries in the top half of the window and then select the "Go to link" button located in about the middle of it-- this will take you to that particular raster so that you can identify it and either remove it or replace it with a non-raster based alternative.

Note that this SVG version of your image, when viewed in Illustrator, may look very different from the same SVG file you thought you had saved just a few minutes prior: this is because Illustrator has made a set of codes during the creation of that file which it then has difficulty reading (SVG is not an Illustrator-proprietary format, AI is, and so while Illustrator will never have difficulty correctly viewing an AI (Adobe Illustrator) file, it will sometimes struggle to correctly render an SVG, even one that it itself produced). Fortunately, even an SVG that looks confusing in Illustrator will usually at least appear to render correctly in most browsers (with the occasional and already noted exception of Firefox) and in Inkscape.

Create a new one

If an image cannot be regenerated or converted, the remaining option is to recreate it — draw a new SVG image, using the existing image as a model. This is manual and the most time-consuming option, but may ultimately yield the highest quality.

In all cases, it may prove useful to touch up the resulting image in an SVG editor — perhaps adding details which are hard or impossible to produce in the originating program, or simplifying or refining a complex conversion (such as simplifying a path described by 100 points to one described by 5 points, if extra points add unnecessary detail).

Once you have created an SVG image, upload it (under a new name), and tag the original raster image with {{Vector version available}}, but please do not delete the raster image or list it for deletion, as it still serves some purposes — see Commons:Superseded images policy for details.

上传与分类

上传至共享资源的每个SVG文件都应展明它是如何制作的:使用{{Inkscape}}{{Adobe}}{{HandSVG}}等模板进行标记。
在上传文件之前你应当检查其外观和有效性;使用共享资源SVG检查工具查验
如果您不确定或是想先了解librsvg如何渲染文件,请将其上传至Test.svg

图像描述

Uploading is described at Commons:初步教程/上传档案.

Make sure to fill out the {{Information}} box as fully as you can. Often, it’s a help when an image has a complete information box as this makes categorization by others easier and allows others to make translations.

See the § SVG software tags section for detailed information on a SVG media.

将SVG文件归类

All SVG graphics should be sorted into the appropriate subcategory or subcategories of Category:SVG files. Please do not place images directly in the parent category as it will become overcrowded and useless (we have thousands and thousands of more than 100,000 SVG files).

Sort subcategories which rely not on subject but on technical aspects ("created with…", "animated", "valid", and so on) by '*' to keep them outside the alphabet listing.

The SVG categories tree

The main tree is Category:SVG, as a part of Category:ImagesCategory:Media types.

Concerning the creation of topical subcategories, it is unnecessary to rebuild the complete hierarchy tree of Category:Topics. Normally, it is enough to gather some topics into one. For instance, Category:SVG colors could contain all color-related SVG files of Category:Colors, so it’s pointless to create Category:SVG red, Category:SVG blue and so on. Maybe some subcategories will become useful later, but stay close to the existing topics tree, and do not put any SVG files only into a SVG category: Categories are primarily for finding media, not for hiding them. Do not over-categorize.

See 共享資源:分類 for general information.

Category naming conventions

Category names start with "SVG" followed by the topic in lowercase (unless it’s a proper noun). For example, a category containing SVG files related to chemistry would be called Category:SVG chemistry. There was no naming convention for a long time, thus you may see titles that do not match this format. These will be converted over time.

标记SVG文件

参见Category:SVG marker templates了解所有可用的SVG标记。
Transcluded from Commons:SVG marker templates

SVG software tags

You will find the complete up-to-date list at SVG created with ... templates
For the software used (Category:SVG graphics by software used):

Adobe-yes.svg This vector image was created with Adobe Illustrator.

Bin2svg logo red.svg This table was created with bin2svg.

ChemDraw icon.svg This structural formula was created with ChemDraw.

Corel logo initial.svg This vector image was created with CorelDRAW.

Dia.svg This diagram was created with Dia.

BJT NPN symbol (case, unlabelled).svg This circuit diagram was created with the Electrical Symbols Library.

SVG Simple Icon.svg This vector image was created with Xfig and a Fig-to-SVG conversion tool.

Gnuplot val.svg This plot was created with Gnuplot.

W3C grn.svg The source code of this SVG is valid.Notepad icon wide.svg This vector image was created with a text editor.

Inkscape-yes.svg This vector image was created with Inkscape.

W3C grn.svg The source code of this SVG is valid.Inkscape to text.svg This vector image was created with Inkscape, and then manually edited.

Metapost-icon.svg This vector image was created with MetaPost.

Sodipodi Logo-V.svg This vector image was created with Sodipodi.

Scribus logo.svg This vector image was created with Scribus.

W3C grn.svg The source code of this SVG is valid.Notepad icon wide.svg This vector image was created with a text editor.

OtherTool logo-V.svg This vector image was created with another SVG tool.

Unknown logo-V.svg This vector image was created with an unknown SVG tool.

Vimlogo.svg This vector image was created with Vim.

Inkscape-yes.svg This vector image was extracted with Inkscape.


See #Software section for a list of programs.

SVG file tags

Replacement filing cabinet.svg This image includes elements that have been taken or adapted from this file:Example.svg Example.svg.



Translate this file This SVG file contains embedded text that can be translated into your language, using any capable SVG editor, text editor or the SVG Translate tool. For more information see: About translating SVG files.

This file is translated using SVG <switch> elements. All translations are stored in the same file! Learn more.

To embed this file in your language (if available) use the lang parameter with the appropriate language code, e.g. [[Help:SVG/zh|lang=en]] for the English version.

To translate this file into your language, you can use the SVG Translate tool. Alternatively, you can download the file to your computer, add your translations using whatever software you're familiar with, and re-upload it with the same name. You will find help in Graphics Lab if you're not sure how to do this.


Animated-runner.svg
This image is an animated SVG file. The .png preview above created by RSVG for use in Wikimedia is not animated and may be incomplete or incorrect. To see the animation, open the original file. It should run in any modern browser or viewer. Recent versions of Chrome, Firefox, Microsoft Edge, Safari, and Opera all support SVG animated with SMIL. Other SVG animations can be found at Category:Animated SVG.

Templates:Animated SVG/I18n

العربية | Boarisch | বাংলা | català | čeština | Deutsch | Deutsch (Sie-Form)‎ | English | español | فارسی | suomi | français | galego | עברית | हिन्दी | magyar | հայերեն | íslenska | italiano | 日本語 | 한국어 | lietuvių | македонски | മലയാളം | Plattdüütsch | Nederlands | occitan | português | português do Brasil | русский | sicilianu | svenska | ไทย | українська | 中文 | 中文(简体)‎ | 中文(繁體)‎ | +/−

.


  • SVG files containing JavaScript cannot be uploaded at present, but this template anticipates that possibility {{Scripted SVG}}.


Cog-scripted-svg.svg
This is a scripted SVG file (it contains JavaScript). The preview above may be incomplete or incorrect. To use the interactive possibilities, open it in your browser.

العربية | Deutsch | Deutsch (Sie-Form)‎ | English | فارسی | magyar | italiano | македонски | മലയാളം | Nederlands | polski | português | русский | sicilianu | 中文‎ | 中文(中国大陆)‎ | 中文(台灣)‎ | +/−



SVG conversion tags

Converted to SVG.svg
All a images in this gallery could be re-created using vector graphics as SVG files. This has several advantages; see Commons:Media for cleanup for more information. If an SVG form of this image is available, please upload it and afterwards replace this template with {{vector version available|new image name}}.

Converted to SVG.svg
All images in this gallery could be re-created using vector graphics as SVG animation files. This has several advantages; see Commons:Media for cleanup for more information. If an SVG form of this image is available, please upload it and afterwards replace this template with {{vector version available|new image name}}.

  • To indicate that you are currently working on a vector version of a raster image you can tag it with {{Vector wip|1=~~~|time=~~~~~}}.

  • For SVG files using embedded bitmaps causing bad quality, use {{BadSVG}} and for rasters that have been superseded by a SVG file, use {{vector version available|File name.svg}}


The file size of this SVG image may be abnormally large because most or all of its text has been converted to paths rather than using the more conventional <text> element. Unless rendering the text of the SVG file produces an image with text that is incurably unreadable due to technical limitations, it is highly recommended to change the paths back to text. Doing so will ease the process of localizing this image to other languages and is likely to reduce the file size in a significant scale. Other SVGs containing path-based text can be found at Category:Path text SVG. For more information, see SVG: Fonts and Preparing images for upload: Text.
Templates:Path text SVG/I18n

italiano  Deutsch  magyar  English  svenska  Tiếng Việt  беларуская (тарашкевіца)‎  македонски  русский  ไทย  日本語  中文(中国大陆)‎  中文  中文(台灣)‎  中文(新加坡)‎  中文(简体)‎  中文(繁體)‎  中文(香港)‎  +/−


Refresh file.svg
This file has been superseded by Example.svg. It is recommended to use the other file. Please note that deleting superseded images requires consent.
new file

Rendering bug.svg
Sorry, this SVG file is solely a source for re-utilization, editing or printing purposes. Please do not use this graphic within Wikipedia articles! MediaWiki isn't able to render this image correctly. Some details may be missing or look wrong. When you include the image in a Wikipedia or any other Wikimedia project site's page, you may want to use the other file, until the support increases.

Help:SVG/zh Gnome-go-next.svg File:SMW Logo.SVG

Deutsch | English | español | italiano | 日本語 | 한국어 | македонски | русский | sicilianu | 中文 | 中文(简体)‎ | 中文(繁體)‎ | +/−

{{{svgImageLabel}}}


{{{image alt}}} This SVG file is a generic template for creating new images. It contains embedded placeholder text using specific fonts that may not be available on Wikimedia Commons. This file is not intended to be embedded in a wiki page. Do not reupload this file with text converted to paths, even if the text appears unsightly in an image preview.
How to derive an image from this template

To create an image using this template:

  1. Download this SVG.
  2. Open the SVG in an SVG editor and change the wording and numbering.
  3. Convert all text to a path and save as a basic or plain SVG.
  4. Upload the new SVG to Wikimedia Commons.

SVG files in MediaWiki

How SVG files work in MediaWiki

When you upload your SVG to Commons (or any other MediaWiki wiki), the software automatically produces PNG thumbnails, embedded in the articles and the description page. If you download the image (usually by right mouse clicking on the image), you will get the PNG image. If you want the SVG file you must save the link to the image instead of the image itself. This works (by right mouse clicking on the link under the image) only on the description page of the image, not on the thumbnail in the category page.

MediaWiki uses librsvg to convert SVG files to PNG files for display (SVG rendering), it has some long and well-known bugs that should be fixed, so you might want to check your file with that program before uploading. You can test the SVG with SVG Check for accurate PNG render preview and W3 XML validator for possible code errors or incompatibility of SVG elements or attributes.

Further information: MediaWiki SVG limitations.

Scaling SVG files via MediaWiki

What this means: Say you want to produce a large version of your SVG for detailed maps, or using in-bitmap software like gimp, or calligraphy printed out one character per page, or something like that. You need to force MediaWiki to produce a huge PNG thumbnail, by using https://commons.wikimedia.org/w/thumb.php?f=Foo.svg&w=1000 or by doing something like [[File:Foo.svg|1000px]] in the sandbox or your talk page or somewhere else unimportant. Printing this giant PNG will look much better than if you try to scale up one of the default thumbnails! Of course, you can also use for-printing SVG software like Inkscape but sometimes that shows something other than what’s shown on-screen (black background, other fonts, etc.).

常见问题

我的SVG图像选择什么尺寸更为合理?
The absolute size of the document does not matter much, since that only affects how it is displayed when viewed by itself. The file size does not depend on the document dimensions. The image can be stretched or compressed as much as a user wants, without changing quality, or file size. With that in mind, the recommended image height is around 400–600 pixels. When a user views the full size image, a width of 600–800 pixels gives them a good close-up view, while still allowing them to fit the entire image on their screen without having to zoom in or out: while 9 × 9 pixels are too tiny, 3000 × 2000 are too large. The length of the shorter side of the PNG rendered by librsvg on Wikimedia is capped at 4096 px (i.e. if width is shorter than height, the length cap of 4096 px will be applied on the width and the height will be scaled accordingly, or vice versa), so there is no point to upload SVG image which requires that much of resolution to be readable when some of the text will be too tiny after scaling down to preview size. Smallest font in SVG image should be readable in 2000-px width at least, the largest recommended rendering resolution in the image description page. Otherwise, a raster version should be provided alongside the SVG source.
如何在我的电脑上将SVG文件转换为光栅格式?
For SVG file which behaves incorrectly in graphic software such as Inkscape, you can simply upload the SVG to Wikimedia then save the link which provides PNG render in other widths in the file description page. You can adjust the number-px in the link to generate the desirable width of the PNG render. For image with any side larger than 4096 px, you may use any conversion tools such as RSVG-Convert with the only difference being the lack of anti-aliasing. If you want the raster image looks smoother, you may convert the SVG to PDF in RSVG-Convert then convert the PDF to raster version in Photoshop (Inkscape still presents some font problem when opening PDF). Another option without uploading SVG source to Wikimedia (due to non-free license) is to use the SVG preview on Wikimedia Toolforge which does not have the maximum side cap, although certain rendering results such as font may differ slightly.
为什么我的图像未能渲染?
This might be due to a number of reasons. Most often it is due to a reference to an external file, a leftover from tracing a bitmap, perhaps. (The rendering stops as the website tries to find this other file) To solve this problem, in your editor, make sure to remove any references to other files before saving the final version. If it is necessary to use bitmaps you can use in Inkscape the function to embedding all images (Effects menu → Images → Embed All Images). It’s also possible that you use special effects like blurring. Unfortunately it’s currently not well supported by librsvg. See also § Plain SVG, compressed SVG, generic specifications hereinbefore.
我可以在哪里得到关于SVG图像的更多帮助?
Try Commons:Graphic Lab if you have a problem with an individual image. Commons:Graphics village pump can be useful for SVG discussion (as well as graphics in general). Often SVG enthusiasts will be around on those pages, and are more than willing to help.
你是怎么在Inkscape中修改图像尺寸的?
The document size starts out with an A4 page. To make this larger or smaller, create a rectangle with the dimensions you desire the document to be, and select it with the arrow tool. Then select File → Document Properties, and under Custom Size, choose Fit page to selection, and click OK. You can now delete the "sizing" rectangle, and move or resize the other elements to fit the space you have created.
在上传到维基共享资源后,我的文本显示为一些小黑块,或者根本不显示!
If you use "Flowed Text" in Inkscape, it will not render at all. Flowed text boxes are created when you click and drag to make you text box. To avoid this, just click once to position your cursor and then type your text. To convert a flowed text box to a normal text box, go to the "Text" menu and choose "Convert to Text".
If this still doesn't work, some text features of Inkscape are not supported by MediaWiki’s renderer, such as text-on-path. If you are not using flowed text and still have problem, convert the text to paths. Do this by selecting the command Path → Object to Path. This will convert the text to paths. Save as plain SVG, and reupload your file.
My arrowheads/dashed lines are appearing as little blocks, or aren't showing up at all after uploading to Commons!
Check that attribute style="overflow:visible" is in tag marker and not in tag path. Some stroke features of Inkscape are not supported by MediaWiki’s renderer. Select the offending objects, and select the command Path → Stroke to Path. This will convert the strokes to paths. Save as plain SVG, and reupload your file.
遇到透明背景怎么修复?
Do you really need to? Usually not! MediaWiki’s renderer will convert the SVG file to PNG with a transparent white background for display (displays white if your browser doesn't support PNG transparencies). Browsers that natively support SVG transparency will show the background color through the image, white! (or grey if the image is displayed as a thumbnail). Leaving your image transparent behind helps future editors, and allows the image to be displayed over other background colors without a big white square. However, if your image really needs a specific colored background, create a rectangle the size of the image, fill it with the background color of your choice, and choose the command Object → Lower to Bottom. Save your image, and enjoy the solid background color![50]
我的字体不能正常渲染。本站点都支持渲染什么字体?
见元维基SVG字体列表。
我使用了维基共享资源所安装的同款字体,但在我SVG图像中的文本定位,本地渲染的和共享资源渲染的看起来仍然不一样。
It depends on which rendering library and version your local renderer is using. Text positioning and other SVG aspects (such as "transform") are known to behave differently in different rendering libraries. For closest result to Wikimedia render, you should use whatever renderer which uses librsvg. Opera, Chrome and Safari gives accurate results. Firefox and Internet Explorer 10 are slightly inaccurate. Safari looks neater when certain font smoothing is enabled.
I'm drawing a flag (or some other insignia) and it asks for PANTONE or CMYK colors. What do I do?
First, if you see the words*PANTONE or CMYK, try to see if they have something called RGB. Wikimedia Commons images are used a lot on Wikimedia projects such as Wikipedia, etc, and are designed for use on computer screens. If you can find RGB colors, use them in favour of others. If you can't, you can convert the colors using your program’s own color picker, or, in the case of PANTONE, Color Finder,[4] from which you can extract RGB values for a color code. Make sure to indicate (perhaps on the talk page or image summary) which method of conversion you used, like "[Some Program] was used to convert CMYK values […] to RGB […]".

软件

许多程序都可以处理SVG文件。您或许会想尝试下边给出的程序,不过可用的并非只有这些程序。其中一些可以免费下载,另一些则是商业软件。

因为SVG只是一个XML规范,所以可以使用文本编辑器,或者你自己的程序/脚本手动编写SVG文件。[51]事实上,许多SVG图像都是用文本编辑器写成的。一个可以高亮显示语法的编辑器将会对你很有帮助。使用W3C SVG 验证器来检查你的作品。

阅览器

如今所有的Web浏览器都可以在本机渲染SVG。

转换器

大多数SVG编辑器都包含有栅格至矢量转换器(图像描摹

  • toollabs:convert,一个PDF转SVG与SVG转PNG转换器
  • Autotrace(警告:其中至少一个链接遭到钓鱼网站篡改),2004年Martin Weber使用以下工具开发的一个库:
  • Scribus (with GhostScript), an EPS-to-SVG converter
  • PDFTron PDF2SVG, commercial PDF-to-SVG converter for Windows
  • Barton PDF2SVG, a PDF-to-SVG converter for Linx, which uses two free libraries called "Poppler" and "Cairo"
  • librsvg, a rendering library used by MediaWiki and the following converters:
    • RSVG-Convert, and open-source tool that converts SVG to PNG, PDF or PS
  • Bitmap to SVG converter - useful for converting pixel art

Editors

Specialized app

  • Ipe, a free and open-source editor with an SVG converter, with good LaTeX integration for mathematical and technical diagrams
  • Scour. For tidying up/create a smaller file size (in Python, also included in Inkscape).
  • Graphviz. An open source application for automatic diagram layout.
  • BKchem. A free software to draw chemical structures in SVG. Runs on Windows, Mac OS X, and Unix systems.
  • Freemind is a free and open source mind mapping application written in Java. FreeMind.
  • GeoGebra is a free and open source multi-platform mathematics software with ability to export SVG. Geogebra.
  • Vector Blocks is a free web-based application for drawing simple electrical circuit schematics.
  • LibreOffice Calc (libreoffice.org), for creating bar charts, pie charts, etc.
  • Gnumeric spreadsheet, saves/exports charts in SVG format, cf. gnumeric.
  • Vecta.io - reduces file sizes

版权

There is some concern that the SVG source code of images might be copyrightable as a "computer program" even if the output is an image in the public domain due to being below the threshold of originality or otherwise indistinguishable from a work that is public domain due to copyright expiration. This could mean that even though the output of an SVG, the image, is in public domain, the code could be restrictively copyrighted, and therefore inappropriate for including in Wikimedia Commons.

Elements that weigh in favor of SVG source code containing sufficient creative expression to be copyrightable might include hand-written code, complex embedded CSS, embedded comments longer than short phrases, or a large carefully selected set of control points. Elements that weigh in favor of SVG source code lacking creativity include programmatically generated code or slavish copying of a public domain source. See the following for additional context:

另见

维护:

参考资料

  1. Quintero, Federico Mena (15 Dec 2017). Librsvg 2.40.20 is released and is the last release in the 2.40.x series. "This is the last release that I will make in the 2.40.x series - the C-only version."
  2. 如果一個style元素沒有指定它的type屬性,那麼類型是從svg元素的contentStyleType獲取的屬性(SVG DTD默認為“text/css”)。http://www.w3.org/TR/SVG11/styling.html#StyleElement
  3. http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
  4. User:JoKalliauer/Optimization#SVG_sourcecode_edits_without_visual_change
  5. W3C – valid DTD list – Optional doctype declarations
  6. a b Don't include a DOCTYPE declaration, W3C – It is not recommended that a DOCTYPE declaration be included in SVG documents.
  7. W3C – There is no (normative external) DTD for SVG 2.0
  8. Validator API, https://validator.w3.org/docs/api.html
  9. W3C: XML declaration
  10. W3C: SVG – Prolog and Document Type Declaration
  11. W3C: XML charencoding
  12. http://www.w3.org/TR/SVG/struct.html#NewDocumentOverview
  13. W3C: SVG linking
  14. W3C: SVG viewBox
  15. Philip Rogers (2015-04-30). Intent to deprecate: SMIL. Google Groups. Retrieved on 2015-06-27.
  16. https://caniuse.com/#feat=svg-smil
  17. User:JoKalliauer/Optimization#SVG_sourcecode_edits_without_visual_change
  18. User:JoKalliauer/Optimization#Useless_elements_that_should_be_kept
  19. https://github.com/scour-project/scour/wiki/Documentation#--renderer-workaround-and---no-renderer-workaround
  20. Inkscape FAQ: What about flowed text?
  21. You can change the colour, of the invisible path, which is used as the boundary of the flowRoot, similar to File:FlowRoot_and_flowRegion.svg, or you could also use the more general path-tag and create other shapes.
  22. User:JoKalliauer/RepairFlowRoot#replace_notempty_flow-text_using_(Inkscape)
  23. 一些案例使用了translate=".."属性,一些则使用了text-align=".."属性
  24. 例如该例子:File:Petit_Monde_de_Gondry,_Jonze_&_Kaufman.svg
  25. 也可以在Github下载
  26. User:JoKalliauer/RepairFlowRoot#delete_empty_flow-text_using_(Text-Editor)
  27. Category:Images_with_SVG_1.2_features
  28. User:JoKalliauer/RepairFlowRoot#That_the_black_square_won't_get_rendered_(Text-Editor)
  29. Attribute viewBox in SVG element takes precedence in defining the native resolution if it differs from width and height attributes.
  30. Font-kerning: Help with file at Graphics village pump, compare also File:Fonttest-Kerning.svg.
  31. textLenght attribute in w3.org
  32. http://www.w3.org/TR/SVG/fonts.html#FontFaceElementFontFamilyAttribute
  33. www.w3.org/TR/2008/REC-CSS2-20080411/fonts.html#generic-font-families
  34. a b User:AntiCompositeNumber on phab:T180923#6557063
  35. W3C: SVG – The ‘tspan’ element
  36. W3C: SVG – White space handling
  37. W3C: SVG 2 – The ‘xml:lang’ and ‘xml:space’ attributes
  38. librsvg still preserves this extra space character but during the middle or end text alignments, this space character is ignored.
  39. https://bugs.launchpad.net/inkscape/+bug/168023
  40. W3C: SVG – The ‘textPath’ element
  41. 10.10 Font selection properties, Text, W3 SVG specification
  42. Avoid the ‚style‘ attribute where possible
  43. Chapter 11: Painting: Filling, Stroking and Marker Symbols. W3C (2012-08-12). Retrieved on 2012-11-28.
  44. paint-order. Mozilla Developer Network (2013-01-12). Retrieved on 2013-10-21.
  45. 优化SVG文件的一个小技巧,由WebpageFX提供
  46. 35-optimizing-svg-tools by CSS-Tricks(35个svg优化工具,由CSS-Tricks提供)
  47. css-tricks : understanding-and-manually-improving-svg-optimization(css-tricks:理解及手动优化svg)
  48. Inkscape tutorial: Tracing
  49. Inkscape wiki: Tools: Vectorize/trace
  50. A feature bug report for this exists since January 2005 on Inkscape launchpad.)
  51. Claudio Rocchini使用C++代码制作的图像
  52. User:JoKalliauer/SVG_test_suites

外部链接