Создание SVG-иконок в Python

Краткий ответ: Чтобы создавать SVG-иконки в Python, используйте небольшой квадратный viewBox, создавайте простые фигуры и элементы <path> с create_element_ns(), группируйте связанные элементы при необходимости, задавайте атрибуты fill и stroke и сохраняйте результат как SVG-файл.

 1from aspose.svg import SVGDocument
 2
 3with SVGDocument() as document:
 4    svg = document.root_element
 5    svg.set_attribute("viewBox", "0 0 64 64")
 6    circle = document.create_element_ns("http://www.w3.org/2000/svg", "circle")
 7    circle.set_attribute("cx", "32")
 8    circle.set_attribute("cy", "32")
 9    circle.set_attribute("r", "28")
10    svg.append_child(circle)
11    document.save("icon.svg")

В этой статье вы узнаете, как:

Генерируемые SVG-иконки лучше работают, когда система координат проста, палитра ограничена, а структуру фигур легко проверить. viewBox размером 64x64 или 100x100 часто достаточно для небольших иконок.

Строительные блоки SVG-иконки

Часть иконкиТипичный SVG-элементПримечания
Фоновый бейдж<circle> или <rect>Используйте простую закрашенную фигуру
Символьная метка<path>, <polyline> или <polygon>Держите path data короткими и читаемыми
Общий стиль<g>Помещайте общий fill, stroke или stroke-linecap на группу
Масштабируемый холстКорневой viewBoxИспользуйте одну систему координат для всех размеров иконки

Как создавать SVG-иконки в Python

Используйте этот рабочий процесс, когда нужна генерируемая иконка, а не редактирование существующего SVG-файла:

  1. Создайте SVGDocument.
  2. Задайте квадратный viewBox, например 0 0 64 64, с set_attribute().
  3. Создайте фоновую фигуру, например круг или скругленный прямоугольник, с create_element_ns().
  4. Добавьте знак переднего плана через <path>, <polyline>, <polygon> или простые фигуры.
  5. Задайте атрибуты fill, stroke, stroke-linecap и stroke-linejoin с set_attribute(), затем добавьте каждый видимый элемент с append_child().
  6. Сохраните SVG с document.save() и проверьте результат в финальном размере отображения.

Создать иконку Check Badge

Следующий пример создает простую круглую иконку с галочкой. Круг служит фоновым бейджем, а галочка – это <polyline> со скругленными концами и соединениями, заданными атрибутами stroke-linecap и stroke-linejoin.

 1import os
 2from aspose.svg import SVGDocument
 3
 4namespace_uri = "http://www.w3.org/2000/svg"
 5
 6output_folder = "output/"
 7output_path = os.path.join(output_folder, "check-badge-icon.svg")
 8os.makedirs(output_folder, exist_ok=True)
 9
10with SVGDocument() as document:
11    svg = document.root_element
12    svg.set_attribute("width", "64")
13    svg.set_attribute("height", "64")
14    svg.set_attribute("viewBox", "0 0 64 64")
15
16    badge = document.create_element_ns(namespace_uri, "circle")
17    badge.set_attribute("cx", "32")
18    badge.set_attribute("cy", "32")
19    badge.set_attribute("r", "28")
20    badge.set_attribute("fill", "#0084A5")
21    badge.set_attribute("stroke", "#00637C")
22    badge.set_attribute("stroke-width", "4")
23    svg.append_child(badge)
24
25    check = document.create_element_ns(namespace_uri, "polyline")
26    check.set_attribute("points", "19,33 28,42 46,23")
27    check.set_attribute("fill", "none")
28    check.set_attribute("stroke", "#ffffff")
29    check.set_attribute("stroke-width", "6")
30    check.set_attribute("stroke-linecap", "round")
31    check.set_attribute("stroke-linejoin", "round")
32    svg.append_child(check)
33
34    document.save(output_path)

Эта иконка использует небольшое количество элементов, поэтому вывод остается удобным для последующего редактирования. Используйте такой стиль для статусных иконок, UI-бейджей, простых кнопок и генерируемых визуальных маркеров.

Иллюстрация показывает результат выполнения примера: круговой элемент <circle> создает бейдж, а белый <polyline> создает галочку. viewBox размером 64x64 сохраняет координаты компактными и упрощает масштабирование иконки.

Круглая SVG-иконка check badge с бирюзовым кругом и белой галочкой polyline, созданная в Python

Создать иконку со знаком path

Используйте <path>, когда знак переднего плана не является простой линией или <polygon>. Следующий пример создает небольшую sparkle-иконку со скругленным прямоугольным фоном и одним знаком <path>.

 1import os
 2from aspose.svg import SVGDocument
 3
 4namespace_uri = "http://www.w3.org/2000/svg"
 5
 6output_folder = "output/"
 7output_path = os.path.join(output_folder, "spark-icon.svg")
 8os.makedirs(output_folder, exist_ok=True)
 9
10with SVGDocument() as document:
11    svg = document.root_element
12    svg.set_attribute("width", "64")
13    svg.set_attribute("height", "64")
14    svg.set_attribute("viewBox", "0 0 64 64")
15
16    background = document.create_element_ns(namespace_uri, "rect")
17    background.set_attribute("x", "4")
18    background.set_attribute("y", "4")
19    background.set_attribute("width", "56")
20    background.set_attribute("height", "56")
21    background.set_attribute("rx", "12")
22    background.set_attribute("fill", "#28B7FF")
23    svg.append_child(background)
24
25    spark = document.create_element_ns(namespace_uri, "path")
26    spark.set_attribute("d", "M32 13 L38 27 L52 32 L38 37 L32 51 L26 37 L12 32 L26 27 Z")
27    spark.set_attribute("fill", "#ff28f4")
28    spark.set_attribute("stroke", "#ffffff")
29    spark.set_attribute("stroke-width", "3")
30    svg.append_child(spark)
31
32    document.save(output_path)

Элемент <path> делает знак иконки компактным. Если приложение рассчитывает геометрию иконки из пользовательского ввода, держите логику построения path data рядом со значениями, которые описывают фигуру.

Иллюстрация показывает сгенерированную sparkle-иконку. Скругленный <rect> создает синий фон, а <path> рисует передний знак из одного компактного значения d.

SVG-иконка sparkle с синим скругленным прямоугольным фоном и розовым знаком path, созданным в Python

Распространенные ошибки и исправления

ПроблемаИсправление
Иконка обрезаетсяОставьте отступ внутри viewBox для stroke и скругленных углов
Иконка выглядит размытой в маленьком размереИспользуйте четкую геометрию, ограниченное количество деталей и согласованные значения stroke-width
Знак трудно перекраситьДержите передний план и фон отдельными элементами
Файл слишком сложныйДля UI-иконок предпочитайте простые фигуры и короткие path data
Иконка плохо масштабируетсяЗадайте стабильный квадратный viewBox и не ограничивайтесь только жестко заданными пиксельными позициями

FAQ

Какой `viewBox` использовать для SVG-иконок?

Квадратный viewBox, например 0 0 64 64 или 0 0 100 100, обычно удобнее всего для генерируемых иконок. Он дает предсказуемую систему координат, которая аккуратно масштабируется.

SVG-иконке лучше использовать элементы `` или базовые фигуры?

Используйте базовые фигуры, когда иконку можно собрать из кругов, прямоугольников, линий или <polygon>. Используйте элементы <path> для пользовательских знаков, кривых или компактных сложных контуров.

Можно ли создавать наборы иконок тем же рабочим процессом?

Да. Повторно используйте один viewBox, палитру, значения stroke-width и вспомогательные функции во всех иконках, чтобы набор оставался визуально согласованным.

Связанные статьи