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

Я боролся с этим какое-то время и не могу найти ответ (который работает) где угодно. У меня есть 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

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

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

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

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

    В панели Transform

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

  4. Установите значения по горизонтали и вертикали в соответствии с вашими потребностями и нажмите Применить

Ответ 2

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

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

Ответ 3

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

  • Загрузите SVG в методе Draw http://editor.method.ac (Файл > Открыть изображение)
  • Разгруппируйте свои элементы (Object > Ungroup elements), возможно, вам придется делать это более одного раза.
  • Выберите свой путь
  • Переориентируйте путь (Object > Reorient Paths).
  • Сохраните изображение (Файл > Сохранить изображение) Если он появится в новом окне, вы можете щелкнуть правой кнопкой мыши и "Сохранить изображение как..."

Ответ 4

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

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

Ответ 5

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

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


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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

В то время как я предпочитаю Inkscape, Affinity Designer (~ $40/Mac) сэкономил мне много усилий при работе с Android Draw Drawables.

Открыть SVG, Файл → Экспорт → SVG → Дополнительно → Сгладить преобразования, отлично работает.

Affinity Designer

Ответ 9

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

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

Ответ 10

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

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

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

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

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

Ответ 11

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

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

Ответ 12

В этом случае просто добавьте перевод к значениям m для каждого ребенка, поэтому -10.254587 + 10.75 = -0.504587 и -308.96875 + 345.43597 = 36.46722.

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

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

Ответ 13

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

Ответ 14

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

Ответ 15

  • Выберите элементы, о которых идет речь
  • Объект > Разгруппировать (повторяйте, пока все не разгруппировано, см. редактор XML для вложенных узлов)
  • Путь > Объект к пути (преобразует многоугольники в пути)
  • Объект > Преобразование > Снимите флажок относительного перемещения > Применить

Ответ 16

Найдено:

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

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

Ответ 17

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

Ответ 18

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

Ответ 19

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

Ответ 20

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

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

Ответ 21

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

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

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

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

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

Ответ 22

Моя конкретная проблема заключалась в символах, которые были определены за пределами страницы, поэтому для отображения на странице требуется преобразование.

Чтобы переместить символы на страницу без необходимости преобразования, мне пришлось пройти эти шаги в Inkscape:

  • Откройте окно "Символы" (Shift + Ctrl + Y)
  • Удалить символ из библиотеки документов. (Там есть кнопка для этого в окне.)
  • Теперь изображение отображается в документе за пределами границы страницы.
  • Разгруппируйте графику. (Это важный шаг!)
  • Переместите графику внутри границы страницы.
  • Добавьте графику обратно в библиотеку символов.

Ответ 23

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

Ответ 24

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

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

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