Упростите SVG, применив преобразование - уменьшите размер - PullRequest
5 голосов
/ 15 мая 2011

У меня довольно часто встречаются SVG с такими структурами:

<svg:g
  transform="translate(-251.5,36.5)"
  id="g12578"
  style="fill:#ffff00;fill-opacity:1">
  <svg:rect
width="12"
height="12"
x="288"
y="35.999958"
id="rect12580"
style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1" />
</svg:g>

Я хотел бы применить translate непосредственно к координатам и удалить атрибут transform:

<svg:g
  id="g12578"
  style="fill:#ffff00;fill-opacity:1">
  <svg:rect
width="12"
height="12"
x="36.5"
y="69.499958"
id="rect12580"
style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1" />
</svg:g>

DoВы знаете скрипт / программу для упрощения SVG?Или Python-фрагмент для разбора SVG?

Этот скрипт работает для моего особого случая, но я бы хотел, чтобы он работал всегда:

#http://epydoc.sourceforge.net/stdlib/xml.dom.minidom.Element-class.html
from xml.dom.minidom import parse, parseString
import re

f = open('/home/moose/mathe/svg/Solitaire-Board.svg', 'r')

xmldoc = parse(f)

p = re.compile('translate\(([-\d.]+),([-\d.]+)\)', re.IGNORECASE)

for node in xmldoc.getElementsByTagName('svg:g'):
  transform_dict = node.attributes["transform"]
  m = p.match(transform_dict.value)
  if m:
    x = float(m.group(1))
    y = float(m.group(2))
  child_rectangles = node.getElementsByTagName('svg:rect') 
  for rectangle in child_rectangles:
    x_dict = rectangle.attributes["x"]
    y_dict = rectangle.attributes["y"]
    new_x = float(x_dict.value) + x
    new_y = float(y_dict.value) + y
    rectangle.setAttribute('x', str(new_x))
    rectangle.setAttribute('y', str(new_y))
  node.removeAttribute('transform')

print xmldoc.toxml()

Я думаю, что размер SVG можетснижается довольно сильно без потери качества, если атрибут transform может быть удален.Если инструмент сможет снизить точность координат, удалив ненужные области, сгруппируйте и стилизуйте, это было бы здорово.

Ответы [ 3 ]

3 голосов
/ 16 мая 2011

Я бы рекомендовал использовать lxml. Это очень быстро и имеет много приятных функций. Вы можете проанализировать свой пример, если правильно объявите префикс пространства имен svg. Вы можете сделать это довольно легко:

>>> svg = '<svg xmlns:svg="http://www.w3.org/2000/svg">' + example_svg + '</svg>'

Теперь вы можете разобрать его с помощью lxml.etree (или xml.etree.ElementTree):

>>> doc = etree.fromstring(svg)

Если вы используете lxml, вы можете воспользоваться XPath:

>>> ns = {'svg': 'http://www.w3.org/2000/svg'}

>>> doc.xpath('//svg:g/@transform', namespaces=ns)
<<< ['translate(-251.5,36.5)']
1 голос
/ 03 февраля 2013

Возможно, вы захотите взглянуть на scour :

Scour стремится максимально уменьшить размер файлов SVG, сохранив при этом исходную визуализацию файлов.,Он не делает это безупречно для всех файлов, поэтому пользователям рекомендуется не перезаписывать свои исходные файлы.

Оптимизация, выполняемая Scour для файлов SVG, включает: удаление пустых элементов, удаление элементов метаданных, удаление неиспользуемых значений атрибута id =удаление недопустимых элементов, обрезка координат до определенного количества значимых мест и удаление метаданных векторного редактора.

0 голосов
/ 15 мая 2011

1) его можно анализировать и редактировать с помощью регулярного выражения.Вы можете легко получить значения перевода и x, y.
2), если вы проверили минидом и уверены, что ваша единственная проблема с ':', поэтому просто замените ':', отредактируйте то, что вам нужно, а затем снова замените его на ':'.
3) вы можете использовать этот вопрос: Существует ли какой-либо скрипт-редактор SVG? , чтобы узнать, как лучше анализировать этот формат XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...