Удаление преобразований в файлах 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). Если я вручную удалю преобразование, изображение переместится в другую часть экрана (как и ожидалось), но мне нужно полностью избавиться от преобразования и в то же время оставить изображение именно там, где я хочу. Есть ли способ удалить / сгладить преобразования в самих координатах пути? (Единственные преобразования, с которыми мне приходится иметь дело, - это перевод и масштабирование, без матриц.)

23 110

23 ответа:

Как удалить преобразование в Inkscape

  1. откройте файл svg в Inkscape
  2. перейти к редактированию - > редактор XML
  3. найти атрибуты "transform" в слоях и удалить их

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

  1. перейти к редактированию - > выбрать все во всех слоях
  2. перейдите в Object -> Трансформировать

    в панели transform

  3. убрать относительное перемещение и применить к каждому объекту отдельно

  4. Set горизонтальный и вертикальный значения в соответствии с вашими потребностями и нажмите кнопку применить

лото

enter image description here

  1. загрузите SVG в метод Draw http://editor.method.ac (Файл > Открыть изображение)
  2. разгруппировать элементы (объект > разгруппировать элементы), возможно, вам придется сделать это несколько раз.
  3. выбрать свой путь
  4. переориентировать путь (объект > переориентировать пути).
  5. Сохранить Изображение (Файл > Сохранить Изображение) если оно появляется в новом окне, вы можете щелкнуть правой кнопкой мыши и "Сохранить Изображение как..."

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

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

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

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

есть расширение inkscape называется Применить Преобразования что пересчитывает пути с его преобразованиями, это именно то, что я искал.

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


кредиты: форум Inkscape > удалить все преобразования, сохраняя при этом на месте

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

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

откройте svg на Inkscape:

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

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

Ура

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

открыть в формате SVG, файл -> экспорт -> СВГ -> дополнительно -> выровнять превращает работал великий.

Affinity Designer

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

Inkscape Preferences > Transforms > Store transformation > Optimized

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

это, кажется, по умолчанию в любом случае.

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

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

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

надеюсь, что это помогает.

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

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

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

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

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

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

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

нашел это:

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

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

  1. выберите элементы, о которых идет речь
  2. объект > разгруппировать (повторять, пока все не будет разгруппировано; см. редактор XML для вложенных узлов)
  3. путь > объект к пути (преобразует полигоны в пути)
  4. объект > преобразование > снимите флажок относительное перемещение > применить

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

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

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

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

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

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

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

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

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

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

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

Mc на форумах Inkscape мне дали данное решение.

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

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

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