it-roy-ru.com

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

119
Ephemera

Как удалить transforms в Inkscape

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

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

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

    В панели Transform

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

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

Бинго

99
Serge Seletskyy

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

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

46
Ephemera

 enter image description here

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

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

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

21
UTF_or_Death

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

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


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

18
piotr_cz

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

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

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

Ура

13
rmartrenado

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

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

13
Thomas W

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

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

 Affinity Designer

11
snodnipper

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

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

8
Rob Hogan

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

Inkscape Preferences > Transforms > Store transformation > Optimized

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

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

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

7
Evgeni Sergeev

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

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

Надеюсь, поможет.

6
Kumar

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

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

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

5
Robert Longson

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

4
mcnesium
  1. Выберите рассматриваемые элементы
  2. Объект> Разгруппировать (повторять, пока все не разгруппировано; см. XML-редактор для вложенных узлов)
  3. Path> Object to Path (конвертирует полигоны в пути)
  4. Объект> Трансформировать> Снять отметку с относительного перемещения> Применить
4
Charlie

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

4
Joel Worsham

Нашел это:

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

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

3
Tobia

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

3
Emily L.

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

1
Skadi2k3

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

1
Jamie Pate

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

0
Jim

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

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

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

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

Наконец, у меня может быть панорама SVG.

0
Jay Day Zee

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

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

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

0
k102

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

File->Save as...->Optimized SVG.
0
Michał Stochmal

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

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

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