Удаление преобразований в файлах SVG

156

Я боролся с этим некоторое время, и, похоже, нигде не могу найти ответ (который работает). У меня есть файл SVG, который выглядит так:

<svg

   xmlns:dc="http://purl.org/dc/elements/1.1/"
   ...
   width="72.9375"
   height="58.21875"
   ...>
   ...
   <g
     ...
     transform="translate(10.75,-308.96875)"
     style="...">
     <path
       inkscape:connector-curvature="0"
       d="m -10.254587,345.43597 c 0,-1.41732 0.17692,-2.85384 0.5312502,-3.5625 0.70866,-1.41733 2.14518,-2.82259 3.5625,-3.53125 1.41733,-0.70866 2.11392,-0.70867 3.53125,0 1.41732,0.70866 ... z"
       ... />
  </g>
</svg>

Я хочу удалить transform="..."линию, но изображение остается там, где я ее разместил (в InkScape). Если я вручную удаляю преобразование, изображение перемещается в другую часть экрана (как и ожидалось), но мне нужно полностью избавиться от преобразования и, в то же время, оставить изображение именно там, где я хочу. Есть ли способ удалить / сгладить преобразования в сами координаты пути? (Единственные преобразования, с которыми мне приходится иметь дело, это перевод и масштабирование, без матриц.)

однодневка
источник
1
Это похоже на stackoverflow.com/questions/10126498/…
Эрик Дальстрем
1
Перекрестные ссылки на stackoverflow.com/q/14684846/2171120
mirabilos

Ответы:

150

Как убрать трансформации в Inkscape

  1. Откройте файл SVG в Inkscape
  2. Перейти в Редактировать -> Редактор XML
  3. Найти атрибуты "transform" в слоях и удалить их

Как полностью переместить все объекты без создания других атрибутов преобразования

  1. Перейдите в Редактировать -> Выбрать все во всех слоях
  2. Перейти к объекту -> Transform

    В панели Transform

  3. Снимите флажок Относительное движение и установите флажок Применить к каждому объекту отдельно.

  4. Установите значения по горизонтали и вертикали в соответствии с вашими потребностями и нажмите Применить
Серж Селецкий
источник
16
Работал на меня. Объекты должны быть разгруппированы, прежде чем они будут преобразованы, чтобы обновлять фактические координаты путей.
Руперт Ангермейер
8
Хм, после установки его в 0 и нажатия кнопки «Применить» преобразование снова появится в редакторе XML.
escapedcat
7
Распаковка объектов необходима для того, чтобы это работало на меня, спасибо!
Хай Чжан
1
Не работал для меня Он сгладит и переместит атрибут transform в листья (фактически все становится листом после разгруппировки), но он не удалит атрибут transform и не применит его к геометрии, без которой я вернусь на круги своя.
Щепан Холышевский
2
ВАЖНО: Как и в приведенном выше комментарии, вам нужно разгруппировать объекты, чтобы это работало правильно, в противном случае атрибут transform будет установлен снова автоматически
Shadow
52

Я решил, в чем проблема. Я надеялся, что мне не придется прибегать к ответу Роберта, хотя я рад за подтверждение, что это сработает! В конце концов ответ Дюопикселя был самым близким, хотя, оказывается, что-то еще происходило.

Когда вы работаете с разными путями в документах Inkscape, я считаю, что по умолчанию он группирует их вместе под <svg:g.../>тегом. При изменении путей в группе Inkscape автоматически добавляет преобразование в группу для представления этих изменений. Однако если вы откроете редактор XML и перетащите свой путь за пределы <svg:g.../>тега и сделаете его собственным <svg:path.../>тегом, Inkscape сможет редактировать отдельные точки по своему усмотрению . В конце концов, это оказалось проблемой группировки, хотя я работал только с одним путем! Надеюсь, что это помогает другим в подобных ситуациях.

однодневка
источник
7
Потрясающие! Спасибо! Это именно то, что он делал. Я просто удалил групповой тег, оставив внутреннее содержимое, сохранил его и снова открыл в inkscape. Конечно, изображение было вне поля просмотра (или как оно там называется), но тогда я просто установил x, y, и оно исправлено. Вот это боль. Спасибо за то, что поделился этим!
johntrepreneur
1
В моем случае я объединил подходы из этого ответа с другим из этого ответа .
Quasiyoke
Это должно быть проголосовано и доведено до вершины. Это решает проблему элегантно и работает для меня. И даже если графика не помещается за пределы холста, вы всегда можете изменить ее размер («Правка»> «Изменить размер страницы на выделение»)
mandarin
48

введите описание изображения здесь

  1. Загрузите SVG в методе Draw http://editor.method.ac (Файл> Открыть изображение).
  2. Разгруппируйте ваши элементы (Object> Ungroup elements), вам может потребоваться сделать это несколько раз.
  3. Выберите свой путь
  4. Переориентировать путь (Объект> Переориентировать пути).
  5. Сохранить изображение (Файл> Сохранить изображение). Если оно появляется в новом окне, вы можете щелкнуть правой кнопкой мыши и «Сохранить изображение как ...»
methodofaction
источник
1
Нет объекта> Переориентировать пути. На какую версию вы ссылаетесь?
0
1
@ 0__ Если этот пункт меню отключен, это означает, что ваш путь все еще находится в группе. Разгруппируйся снова.
methodofaction
37

Существует расширение inkscape под названием Apply Transforms, которое пересчитывает пути с их преобразованиями. Это именно то, что я искал.

После установки вы найдете его в меню « Расширения»> «Изменить путь»> «Применить преобразование» .


Титры: Inkscape forum> Удалите все преобразования, оставив их на месте

piotr_cz
источник
Это расширение было обновлено, и теперь оно работает и для rects, по крайней мере, в моем тестировании.
силь
Абсолютно. Сила, которую дает этот маленький плагин, неизмерима!
Бретт
23

Для групп перегруппировка может сделать работу быстро. Выберите группу и нажмите Ctrl + Shift + G (разгруппировать), а затем Ctrl + G (группа).

Для некоторых объектов, которые имеют похожую проблему, например, спирали и звезды, быстрый способ - нажать Ctrl + Alt + C (штрих к пути) - это, однако, преобразует объект в чистый путь и удаляет все дополнительные атрибуты, такие как sodipodi: cx, sodipodi: революции и так далее.

UTF_or_Death
источник
23

Откройте свой svg на Inkscape :

  • Выберите группу, которая содержит все те преобразования, от которых вы хотите избавиться
  • Нажмите CTRL+ U(разгруппировать)
  • Нажмите CTRL+ G(снова группа)

Таким образом вы избавитесь от преобразований, примененных к группе, и они будут перенесены в пути, содержащиеся в этой группе.

rmartrenado
источник
1
Отлично! Это сработало в Inkscape 1.0
Волшебник из Огза
14

По моему опыту, если вы используете Inkscape, достаточно слегка переместить элемент пути (например, с помощью клавиш курсора), и Inkscape удалит атрибут transform и соответствующим образом скорректирует данные пути. (Раздражает, если вы действительно хотите сохранить атрибут преобразования.)

Итак, вы можете просто выбрать путь (убедитесь, что это путь, а не окружающая группа), нажать правую и левую клавиши курсора, и все готово.

Томас В.
источник
1
Похоже, это не работает для элемента <g>. Я пытаюсь избавиться от атрибута преобразования.
Макс Спринг
5
Может быть, сначала попробуйте разгруппировать, а потом перегруппировать.
Томас W
1
Вау, работал как шарм! Это должен быть принятый ответ. Не нужно никаких дополнительных инструментов, никаких сложных шагов. Другие ответы не работают, если путь вложен в преобразованный объект, <g>и я хочу сохранить преобразование в <g>.
tomekwi
Также не работает для пути, созданного инструментом круга
sdaau
1
Лучший ответ. Возможно, одним из источников путаницы является параметр «Настройки»> «Преобразования»> «Хранить преобразования», о котором я здесь не упоминал. Должно быть установлено значение «оптимизировано». Затем удаляются только разгруппировка, перемещение, перегруппировка и нечеткие преобразования.
Mr5o1
13

Хотя я предпочитаю Inkscape, Affinity Designer (~ 40 долларов США / Mac) сэкономил мне много времени при работе с Android Vector Drawables.

Откройте SVG, File -> Export -> SVG -> More -> Flatten transforms отлично работали.

Affinity Designer

snodnipper
источник
12

SVGO является отличным открытым исходным кодом инструмент командной строки для этого и куча других оптимизаций. Для него есть такой же отличный веб-интерфейс под названием SVGOMG.

Соответствующие параметры в этом случае moveGroupAttrsToElems(SVGOMG: Move group attrs to elements) , чтобы переместить transformатрибуты из групп элементов пути, плюс convertPathData(SVGOMG: Round/rewrite paths) выравниваться transformв d.

Роб Хоган
источник
1
SVGO невероятно. Это действительно должен быть принятый ответ, тем более что stackoverflow предназначен для точки зрения программиста, и это, безусловно, лучшее решение для программиста, разрабатывающего сайт, содержащий SVG. Поместить это в ваш конвейер развертывания гораздо лучше, чем научить своих художников удалять преобразования вручную (или делать это самостоятельно) и получать отчет об ошибках каждый раз, когда они забывают
UTF_or_Death
3
За исключением того, что это больше не работает. Я помню, как он работал лучше один раз, но об этой проблеме рассказывают именно о github.com/svg/svgo/issues/624 для SVGO
подробнее
9

Следует отметить, что в настройках есть «Оптимизированный» режим:

Настройки Inkscape> Трансформации> Трансформация магазина> Оптимизировано

Что должно минимизировать появление transformатрибутов в максимально возможной степени (но не делает).

Похоже, это включено по умолчанию.

Согласно обсуждению , один случай, когда этот оптимизированный режим испытывает недостаток в усердии, - это когда размер страницы изменяется . Это заставляет translateпреобразование быть примененным к <g>элементу слоя . Кажется, что на данный момент лучшим решением является эвакуация детей в другой слой.

Евгений Сергеев
источник
2
Чтобы изменить размер страницы, не создавая раздражающих translateпреобразований на каждом слое, попробуйте открыть .svgфайл в текстовом редакторе и управлять атрибутами высоты и ширины, которые отображаются в верхней части.
февральInk
7

Inkscape имеет возможность очистить данные преобразования, но при этом оставить значение объекта без изменений.

В Inkscape выберите объект и меню «Путь», «Упростить». Теперь у вас будут удалены преобразования.

Кумар
источник
16
Это, однако, изменит контур ваших путей и уменьшит количество вершин в сложных формах.
Чарли
1
Это часто делает разметку больше, чем до преобразования.
Чарли
6

В этом случае просто добавьте перевод к значениям m для каждого дочернего элемента, чтобы -10,254587 + 10,75 = -0,504587 и -308,96875 + 345,43597 = 36,46722.

Поскольку все термины в примере являются относительными (то есть строчными буквами), вот и все. Если бы они были абсолютными (верхний регистр), например, M или C, их тоже пришлось бы корректировать.

Для масштаба вы должны умножить все дочерние значения на шкалу.

Роберт Лонгсон
источник
Я сделал это, но в XML-редакторе Inkspace (или любом другом редакторе) преобразование все еще добавляется. Weird.
escapedcat
1
Каким образом вы бы скорректировали C, если бы у вас было 2 подпути, например, M 8,0 12,0 C 11,3 13,1 14,1 13,55 16,0 13,0 C 2,4 9,8 2,8 10,2 8,0 12,0 C 7,6 7,8 7,6 8,1 5,0 9,0 и M 3,0 5,0 C 2,4 5,5 3,3 6,4 5,0 7,0, которые Вы хотите превратить в один путь?
Установка
@ Не используйте кнопку « Задать вопрос» , если у вас есть вопрос, который не охватывается существующими ответами. Сложно задавать вопросы и отвечать в комментариях, поскольку доступно очень ограниченное форматирование.
Роберт Лонгсон
2
@RobertLongson хорошо, что ты сделал это. Все, чего я хочу, это чтобы вы уточнили: «Если бы они были абсолютными (верхний регистр), например, M или C, их тоже пришлось бы корректировать».
Установка
6
  1. Выберите рассматриваемые элементы
  2. Объект> Разгруппировать (повторять, пока все не разгруппировано; см. XML-редактор для вложенных узлов)
  3. Path> Object to Path (преобразовывает полигоны в пути)
  4. Объект> Трансформировать> Снять отметку с относительного перемещения> Применить
Чарли
источник
Кажется, не работает в Inkscape 0.91. <g>С transformпребыванием атрибута так же , как это было. Кроме того, мой объект (как показано в вопросе здесь) уже является путем.
ИЛИ Mapper
Можете ли вы вставить ссылку на свой SVG?
Чарли
5

Чтобы удалить атрибут преобразования из gэлемента (группы) в Inkscape, вы можете переместить группу на ее окончательное место, разгруппировать ее, а затем перегруппировать все элементы. Теперь новая группа создана, и если вы не переместите ее снова, к ней не будет прикреплен атрибут transform.

mcnesium
источник
4

Если кто-то приземлится здесь в поисках решения для этого в Sketch 3, выберите слой и затем нажмите Layer-> Paths-> Flatten.

Джоэл Уоршам
источник
3

Нашел это:

  • Установите желаемый размер страницы *
  • Если ваш текущий слой имеет преобразование (проверьте с помощью редактора XML, это верхняя группа под элементом SVG), затем создайте новый слой и переместите все объекты в него
  • Разгруппировать любые группы (это может не понадобиться, YMMV)
  • Выделите все объекты и примените нулевое преобразование (например, масштаб на 100% 100% или стрелка вправо + стрелка влево), имея преобразование Store: оптимизировано в настройках / преобразованиях
  • Если вам пришлось отменить какие-либо группы, теперь вы можете перегруппировать их
  • Сохраните копию как оптимизированный SVG и установите желаемую точность чисел

*: Или, по крайней мере, разместите объекты там, где они вам нужны, относительно верхнего левого угла страницы. К сожалению, координаты SVG ссылаются на верхний левый угол, а Inkscape изменяет размер страницы относительно нижнего левого!

Тобия
источник
Мне был нужен трюк "перейти к другому слою", поскольку преобразование, которое я хотел нажать, было на <g> слоя. Система координат Inkscape довольно раздражает.
Мутант Боб
3

Мне удалось избавиться от matrix(...)преобразования (из-за зеркального отображения), объединив путь с прямоугольником, а затем удалив узлы прямоугольника. translate(...)Часть осталась , хотя.

Эмили Л.
источник
Это единственное решение, которое я тоже нашел. Объедините с новым чистым путем, затем удалите ненужную часть.
Мартон Тамас
2

В моем случае сохранение как оптимизированный SVG решило проблему. Так что в Inkscape используйте:

Файл -> Сохранить как ... -> Оптимизирован SVG.

Михал Стохмаль
источник
В чем заключалась ваша проблема? Я пришел сюда, попробовав все. Но проблема все еще сохраняется.
Саху V Кумар
@VishalKumarSahu Не удалось импортировать значок приложения для Android (SVG) в качестве ресурса из-за transformатрибута, который не поддерживается Android Studio.
Михал Стохмаль
Да, и это то же самое в сети тоже. Преобразование создает проблему в выводе, но весьма полезно при расположении объектов в группе. Я должен сделать расчеты, чтобы решить цель.
Саху V Кумар
2

Это работает, если вы используете Inkscape:

  1. Выберите все и разгруппируйте
  2. Сохранить как «Оптимизированный Svg (* .svg)»

Во всех случаях, которые я пробовал, это удалило все атрибуты преобразования. Не уверен, что это работает для более сложных SVG.

Max888
источник
1

Я попробовал опубликованное здесь решение, а именно: удалить групповые теги в SVG-файле и снова открыть его в Inkscape (0.48.3.1 в моем случае). Увы, после того, как я снова перевел пути, используя режим выбора и преобразования (F1) и сохранил его, теги группы снова появились! Inkscape сохраняет все преобразования, примененные к пути в окружающем элементе группы. Если вы не используете инструмент выбора пути (F2), нажмите Ctrl + A и переместите узлы пути в нужное место. После того, как я сделал это и сохранил впоследствии, Inkscape не добавил групповые теги, потому что этот перевод применялся непосредственно к модели пути. Надеюсь это поможет.

Skadi2k3
источник
1

В моем случае группы на самом деле вызваны слоями. Удаление всех слоев в документе привело к удалению группы и преобразования (возможно, в сочетании с разгруппировкой объектов и их перегруппировкой и т. Д., Как в разделе Удаление преобразований в файлах SVG (answer-35490189 из @Charlie выше))

Джейми Пэйт
источник
0

Моя конкретная проблема была с символами, которые были определены вне страницы, таким образом, требуя преобразования, которое будет показано на странице.

Чтобы переместить символы на страницу без преобразования, мне нужно было выполнить следующие действия в Inkscape:

  1. Откройте окно символов (Shift + Ctrl + Y)
  2. Удалить символ из библиотеки документов. (Для этого есть кнопка в окне.)
  3. Теперь изображение отображается в документе за пределами страницы.
  4. Разгруппируйте изображение. (Это жизненно важный шаг!)
  5. Переместить рисунок внутри границы страницы.
  6. Добавьте изображение обратно в библиотеку символов.
Питер
источник
0

Это кажется случайным, но ничто другое, что я пробовал, не сработало, так что вот вам случайный другой человек. Некоторые из моих путей имели своего рода поле вокруг них, которое можно было увидеть только при их выборе ( пример). Я думаю, что это было создано, когда я вставил слой из другого файла Inkscape и повернул его на 90 градусов. Это заставило заливку узора на фигурах иметь другое преобразование (линии разнесены дальше). Это также заставило выравнивать объекты не работать, как ожидалось. Использование Apply Transform, упомянутого @Piotr_cz, решило проблему с преобразованием, но странное поле осталось. Я случайно избавился от него, изменив Blur на Stroke на любое значение и вернув его к нулю.

Джим
источник
0

Как-то мне не повезло ни с одним из подходов. Если <defs>в вашем svg есть раздел и его использование выглядит следующим образом:

<g transform="matrix( *** ) "><use xlink:href="#***"/></g>

Возможно, вам придется удалить все использования и удалить все из раздела defs. Затем вы можете использовать inkscape для правильного размещения всего этого, а затем применить преобразования, используя упомянутый плагин. Надеюсь, это кому-нибудь поможет.

K102
источник
0

У меня была эта проблема в течение многих лет. Очевидно, что решение заключается в том, чтобы иметь возможность динамически воспроизводить преобразования в браузере, если он не будет «исправлен» в inkscape.

Пользователь Mc на форумах Inkscape дал мне это решение .

Решение создает текущее преобразование между элементом SVG и его корневым элементом SVG, а затем возвращает полный набор информации BBox на основе суммы преобразований.

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

Наконец, у меня действительно может быть панорама SVG.

Джей Дэй Зи
источник
0

Inkscape 1.0 на Kubuntu 20.04

Хотя эта ветка довольно старая, я хотел бы опубликовать свой опыт / решение. Я столкнулся с этой проблемой, когда пытался создать шаблон для FreeCAD TechDrawing Workbench. Эти шаблоны не должны содержать никаких преобразований.

В моем случае мне пришлось добавить логотип компании из внешнего файла .svg (целиком сделанного с помощью Inkscape). Этот логотип содержит как графические, так и текстовые элементы. При копировании этого логотипа в шаблон были созданы преобразования, из-за которых шаблон работал некорректно в FreeCAD.

  • Во-первых, это решение, предложенное на www.freecadweb.org / ... , не работает для меня. Вот почему я искал в Интернете и нашел это обсуждение.

  • Во-вторых, ни одно из предложенных выше решений не сработало для меня, но они поставили меня на правильный путь. Ответ Чарли был близок, но Object> Transform> Uncheck относительный ход> Apply не показал никакой разницы.

Что сработало для меня:

  1. Как уже упоминалось, разгруппируйте все.
  2. Преобразование текстовых объектов в путь - это, казалось бы, важно в моем случае!
  3. Удалите все существующие преобразования в редакторе xml и посмотрите, что происходит со связанными объектами. В моем случае соответствующие элементы изменили свое положение.
  4. Исправьте эти изменения вручную, но не группируйте ничего.
  5. Сохранить как обычный svg (обычный = без оптимизации или другие специальные настройки были использованы)

Работает нормально, когда я использую этот шаблон в FreeCAD.


Одна странная деталь: хотя мое решение указывает на то, что текстовые элементы были проблемой в моем случае, это не может быть так просто. На самом деле базовый документ (тот, в который я скопировал логотип) содержит много текстовых элементов, и я не конвертировал ни один из них. Так что это может быть сочетание «внешнего источника» и текстовых элементов. Я просто публикую эту деталь как подсказку для других, у которых могут быть связанные проблемы.

Mr.Bum
источник