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

776   23  
svg

23 ответов:

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

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

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

  1. перейти к редактированию - > выбрать все во всех слоях
  2. Перейти к объекту - > преобразование

    В панели преобразования

  3. Снимите Флажок Относительный перемещение и проверка применяются к каждому объекту отдельно

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

Бинго

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

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

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

Когда вы работаете с различными путями в документах 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, достаточно немного переместить элемент path (например, с помощью клавиш курсора), и Inkscape удалит атрибут transform и соответствующим образом настроит данные пути. (Раздражает, если вы действительно хотите сохранить атрибут transform.)

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

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

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

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

Ура

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

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

Дизайнер Аффинити

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

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 для каждого ребенка так -10.254587 + 10.75 = -0.504587 и -308.96875 + 345.43597 = 36.46722.

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

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

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

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

Нашел:

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

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

  1. Выберите элементы, о которых идет речь
  2. Object > Ungroup (повторять, пока все не будет разгруппировано; см. редактор 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. Добавьте изображение обратно в библиотеку символов.

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.