Видалення перетворень у файлах SVG


155

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



Відповіді:


149

Як видалити перетворення в Inkscape

  1. Відкрийте файл SVG в Inkscape
  2. Перейдіть до редагування -> Редактор XML
  3. Знайдіть атрибути "перетворення" в шарах та видаліть їх

Як взагалі переміщувати всі об'єкти без створення інших атрибутів перетворення

  1. Перейдіть до редагування -> Вибрати все в усіх шарах
  2. Перейдіть до об’єкта -> перетворити

    На панелі "Трансформація"

  3. Зніміть прапорці щодо відносного руху та встановіть прапорець Застосувати до кожного об’єкта окремо

  4. Встановіть горизонтальні та вертикальні значення відповідно до ваших потреб та натисніть Застосувати

16
Працювали для мене. Об'єкти потрібно розгрупувати до їх перетворення, щоб актуальні координати шляхів оновлювались.
Руперт Анжермейер

8
Hm, після встановлення його на 0 та натискання кнопки застосувати перетворення знову з'являється в редакторі XML.
втекли котом

7
Розігрування об'єктів необхідно, щоб це працювало для мене, дякую!
Хай Чжан

1
Не працювало для мене. Він згладить і перемістить атрибут трансформації до листя (насправді все стає аркушем після розгрупування), але він не ВИДАЄТЬСЯ атрибут трансформації та застосує його до точки геометрії, без якої я повернувся до першого.
Szczepan Hołyszewski

2
ВАЖЛИВО: Як пояснений вище коментар, вам потрібно розгрупувати об'єкти, щоб це працювало правильно, інакше атрибут трансформації буде встановлений знову автоматично
Shadow

52

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

Коли ви працюєте з різними шляхами в документах Inkscape, я вважаю, що її поведінка за замовчуванням полягає у згрупуванні їх разом під <svg:g.../>тегом. Змінюючи шляхи в групі, Inkscape автоматично додасть перетворення в групу для представлення цих змін. Однак якщо ви відкриєте редактор XML і перетягніть свій шлях поза <svg:g.../>тегом і зробите його власним <svg:path.../>тегом, Inkscape може редагувати окремі точки за бажанням. Врешті-решт це виявилося груповою проблемою, хоча я працював лише одним шляхом! Сподіваюся, що це допомагає іншим у подібних ситуаціях.


7
Дивовижно! Дякую! Саме це і робило. Я щойно видалив тег групи, залишивши внутрішній вміст, зберег його та знову відкрив його в Inkscape. Звичайно зображення було поза вікном перегляду (або як воно ще називається), але тоді я просто встановив х, у і воно виправлене. Який біль. Дякуємо, що поділилися цим!
Johntrepreneur

1
У моєму випадку я поєднав підходи з цієї відповіді з іншим з цієї відповіді .
quasiyoke

Це слід заохочувати та доводити до початку. Це вирішує проблему елегантно і працювало для мене. І навіть якщо графіка не розміщена за межами полотна, ви завжди можете змінити її розмір (Правка> Змінити розмір сторінки до вибору)
мандарин

48

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

  1. Завантажте свій SVG у метод малювання http://editor.method.ac (Файл> Відкрити зображення)
  2. Розгрупуйте свої елементи (Object> Ungrup elements), можливо, вам доведеться це робити не один раз.
  3. Виберіть свій шлях
  4. Переорієнтуйте шлях (Об'єкт> Переорієнтовані контури).
  5. Збережіть своє зображення (Файл> Зберегти зображення) Якщо воно з'явиться у новому вікні, ви можете натиснути правою кнопкою миші та "Зберегти зображення як ..."

1
Немає Об'єкта> Переорієнтовані шляхи. На яку версію ви посилаєтесь?
0__

1
@ 0__ Якщо цей пункт меню вимкнено, це означає, що ваш шлях все ще знаходиться в групі. Знову розгрупуйте.
методофакція

37

Існує розширення Inkscape Apply Transforms, яке перераховує шляхи з їх перетвореннями. Це саме те, що я шукав.

Після його встановлення ви знайдете меню в розділі Розширення> Змінити шлях> Застосувати перетворення .


кредити: Форум Inkscape> Видаліть усі перетворення, зберігаючи свої місця


Це розширення було оновлено, і тепер воно працює і для рективів, принаймні в моєму тестуванні.
sil

Абсолютно. Сила, яку надає цей маленький плагін, незмірна!
Бретт

23

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

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


23

Відкрийте свій svg на Inkscape :

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

Таким чином ви позбудетесь від перетворень, застосованих до групи, і вони будуть перенесені на шляхи, які містяться в цій групі.


1
Ідеально! Це працювало в Inkscape 1.0
Wizard of Ogz

14

На мій досвід, якщо ви використовуєте Inkscape, достатньо трохи перемістити елемент шляху (наприклад, за допомогою клавіш курсору), і Inkscape видалить атрибут трансформації та відповідно скоригує дані шляху. (Дратує, якщо ви насправді хочете зберегти атрибут перетворення.)

Отже, ви можете просто вибрати шлях (переконайтеся, що це шлях, а не навколишня група), натисніть праворуч і ліву клавішу курсору, і все закінчено.


1
Схоже, це не працює для елемента <g>. Я намагаюся позбутися атрибута трансформації.
Макс Весна

5
Можливо, спробуйте розгрупувати спочатку і перегрупувати їх потім.
Томас Ш

1
Нічого собі, працював як шарм! Це має бути прийнятою відповіддю. Ніяких додаткових інструментів не потрібно, ніяких складних кроків. Інші відповіді не спрацьовують, якщо шлях вкладений в перетворений, <g>і я хочу зберегти перетворення на <g>.
tomekwi

Не працює для шляху, створеного інструментом кола,
sdaau,

1
Найкраща відповідь. Можливо, одним із джерел плутанини є параметр Налаштування> Перетворення> Зберігання транформацій, про який я не бачу тут ніде. Його слід встановити на "оптимізований". Потім видаляються просто розгрупування, переміщення, перегрупування та перетворення грунту.
Mr5o1

13

Хоча я віддаю перевагу Inkscape, дизайнеру прихильності (~ $ 40 / Mac) заощадив мені години зусиль під час роботи з Android Vector Drawables.

Відкрийте SVG, Файл -> Експорт -> SVG -> Більше -> Зрівняти перетворення спрацювало чудово.

Дизайнер прихильності


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/isissue/624 для SVGO
morewry

9

Слід зазначити, що в налаштуваннях існує режим "Оптимізований":

Налаштування Inkscape> Перетворення> Зберігання перетворень> Оптимізовано

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

Здається, це все одно увімкнено.

Згідно з обговоренням , одним із випадків, коли цьому оптимізованому режиму не вистачає завзяття, є зміна сторінки . Це призводить translateдо нанесення перетворення на <g>елемент шару . Здається, що евакуація дітей на інший шар - це найкраще рішення на даний момент.


2
Щоб змінити розмір сторінки, не створюючи дратівливих translateперетворень на кожному шарі, спробуйте відкрити .svgфайл у текстовому редакторі та маніпулювати атрибутами висоти та ширини, що з’являються у верхній частині.
лютийІнь

7

Inkscape має можливість очистити дані перетворення, але все-таки залишити значення об'єкта немодифікованим.

У Inkscape виберіть об'єкт і меню "Шлях", "Спростити". Тепер у вас будуть видалені перетворення.


16
Однак це змінить контури ваших шляхів і зменшить кількість вершин у складних формах.
Чарлі

1
Це часто робить розмітку більшою, ніж до перетворень.
Чарлі

6

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

Оскільки всі терміни в прикладі відносні (тобто малі регістри), це все. Якщо такі були абсолютні (верхній регістр), наприклад, M або C, їх також слід було б відрегулювати.

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


Я це зробив, але в редакторі Inkspace XML (або будь-якому іншому редакторі) трансформація все ще додається. Дивно.
втекли котом

1
Яким чином ви б налаштували C, якби у вас були два підпутника, наприклад, M 8,0 12,0 C 11,3 13,1 14,9 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 6,3 6,4 5,0 7,0 Який ви хочете перетворитися на один шлях?
Установка

@Anton скористайтеся кнопкою " задати питання", якщо у вас є питання, яке не охоплене наявними відповідями. Важко запитати і відповідати в коментарях, оскільки доступне дуже обмежене форматування.
Роберт Лонгсон

2
@RobertLongson добре, що ти це прикрив. Все, що я хочу, - це ви докладно сказати: "Якщо такі були абсолютні (верхній регістр), наприклад, M або C, вони також повинні були бути скориговані".
Установка

6
  1. Виберіть елементи, про які йдеться
  2. Об'єкт> Розгрупування (повторюйте, поки все не буде розгруповано; див. Редактор XML щодо вкладених вузлів)
  3. Шлях> Об'єкт до Шляху (перетворює багатокутники в шляхи)
  4. Об'єкт> Перетворити> Зніміть позначку відносного переміщення> Застосувати

Схоже, це не працює в Inkscape 0.91. <g>З transformперебуванням атрибута так само , як це було. Крім того, мій об’єкт (так само, як показано у питанні тут) - це вже шлях.
АБО Mapper

Чи можете ви вставити посилання на свій SVG?
Чарлі

5

Щоб видалити атрибут перетворення з gелемента (групи) в Inkscape, ви можете перемістити групу до її остаточного місця, розгрупувати її і потім перегрупувати всі елементи. Тепер створена нова група, і якщо ви не перемістите її знову, вона не отримає атрибут трансформації, приєднаний до неї.


4

Якщо хтось приземлився тут, шукаючи рішення зробити це в Sketch 3, виберіть шар і натисніть на Шару-> Шляхи-> Зрівняти.


3

Знайшов це:

  • Встановіть бажаний розмір сторінки *
  • Якщо ваш поточний шар має перетворення (зверніться до редактора XML, це верхня група під елементом SVG), тоді створіть новий шар і перемістіть до нього всі об’єкти
  • Розгрупуйте будь-які групи (це може не знадобитися, YMMV)
  • Виберіть усі об'єкти та застосуйте нульове перетворення (наприклад, масштаб на 100% 100%, або стрілка вправо + стрілка вліво), зберігаючи перетворення в магазині: Оптимізовано в налаштуваннях / перетвореннях
  • Якщо вам довелося скасувати будь-які групи, тепер ви можете їх перегрупувати
  • Збережіть копію як оптимізований SVG та встановіть бажану числову точність

*: Або принаймні розміщуйте об’єкти там, де вони вам потрібні, щодо лівого верхнього кута сторінки. Прикро, що координати SVG посилаються на верхній лівий кут, а Inkscape змінює розмір сторінки відносно лівого нижнього!


Мені знадобився трюк "перейти на інший шар", оскільки трансформація, яку я хотів натиснути, була на шарі <g>. Система координат Inkscape досить дратує.
Мутант Боб

3

Мені вдалося позбутися matrix(...)трансформації (завдяки дзеркальному відображенню), поєднавши шлях з прямокутником, а потім видаливши вузли прямокутника. translate(...)Частина залишилася , хоча.


Це єдине рішення, яке я теж знайшов. Поєднайте новий чистий шлях, після чого видаліть непотрібну частину.
Márton Tamás

2

У моєму випадку збереження як оптимізований SVG вирішило проблему. Тож у Inkscape використовуйте:

Файл -> Зберегти як ... -> Оптимізований SVG.


Яка у вас проблема BTW? Я прийшов сюди, перепробувавши все. Але проблема все ще зберігається.
Саху V Кумар

@VishalKumarSahu Не вдалося імпортувати значок додатка для Android (SVG) як актив, оскільки transformатрибут Android не підтримується.
Michał Stochmal

Так, це теж самий випадок і в Інтернеті. Трансформація створює проблеми у виході, але є досить корисною під час розташування об'єкта як групи. Я повинен робити розрахунки, щоб вирішити мету.
Саху V Кумар

2

Це працює, якщо ви використовуєте Inkscape:

  1. Виберіть усе та розгрупуйте групу
  2. Зберегти як "Оптимізований Svg (* .svg)"

У всіх випадках, які я намагався, це видалило будь-які атрибути перетворення. Не впевнений, чи працює він для більш складних SVG.


1

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


1

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


0

Моя конкретна проблема полягала в тому, щоб символи, які були визначені за межами сторінки, вимагали перетворення на сторінці.

Щоб перемістити символи на сторінку, не вимагаючи перетворення, мені довелося пройти ці кроки в Inkscape:

  1. Відкрийте вікно Символи (Shift + Ctrl + Y)
  2. Видаліть символ із бібліотеки документів. (У вікні є кнопка для цього.)
  3. Тепер зображення відображається в документі, поза межами сторінки.
  4. Розгрупуйте графіку. (Це життєво важливий крок!)
  5. Перемістіть графіку всередині межі сторінки.
  6. Додайте графіку назад до бібліотеки символів.

0

Це здається випадковим, але нічого іншого я не намагався працювати, тож тут ви йдете випадково іншою людиною. Деякі мої шляхи мали певний запас навколо них, який можна було побачити лише під час їх вибору ( приклад). Я думаю, що це було створено, коли я вставив шар з іншого файлу Inkscape і повернув його на 90 град. Це зробило викрійку заливки фігурами різною трансформацією (лінії, розташовані далі один від одного). Це також змусило вирівняти об'єкти не працювати, як очікувалося. Використання згаданої @Piotr_cz Застосувати трансформацію виправило проблему перетворення, але дивний запас залишився. Я випадково позбувся цього, змінивши Blur on Stroke на будь-яке значення і повернувши його до нуля.


0

Якось мені не пощастило ні з одним із підходів. Якщо <defs>у вашому svg є розділ та такі звичаї:

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

можливо, вам доведеться видалити всі звички та вийняти все з розділу defs. Потім ви можете використовувати Inkscape, щоб розмістити все це правильно, а потім застосувати перетворення за допомогою згаданого плагіна. Сподіваюся, це комусь допоможе.


0

У мене це питання виникає роками. Рішення полягає в тому, щоб мати можливість динамічно грати з перетвореннями в браузері, якщо його не буде "виправлено" в Inkscape.

Користувач Мак на форумах Inkscape дав мені це рішення .

Рішення будує поточне перетворення між елементом SVG та його кореневим елементом SVG, а потім повертає повний набір інформації BBox на основі загальної кількості перетворень.

Можна також легко змінити, до якого елемента відносяться обчислення, якщо ви хочете виконати роботу браузера між двома частинами одного SVG-файлу.

Нарешті, у мене фактично може бути панорамування SVG-огляду.


0

Inkscape 1.0 на Kubuntu 20.04

Хоча ця тема досить стара, я хотів би опублікувати свій досвід / рішення. Я зіткнувся з цією проблемою, намагаючись створити шаблон для робочої версії TechDrawing FreeCAD. Ці шаблони не повинні містити перетворень.

У моєму випадку мені довелося додати логотип компанії із зовнішнього .svg-файлу (повністю зробленого за допомогою Inkscape). Цей логотип містить графічні, а також текстові елементи. При копіюванні цього логотипу в шаблон були створені трансформації, які спричинили неправильну роботу шаблону у FreeCAD.

  • По-перше, це рішення, запропоноване на сайті www.freecadweb.org / ... , не працює для мене. Ось чому я шукав в Інтернеті і знайшов цю дискусію.

  • По-друге, жодне із запропонованих вище рішень не спрацювало для мене, але вони поставили мене на правильний шлях. Відповідь Чарлі наблизилася, але Об'єкт> Перетворення> Зніміть позначку відносного переміщення> Застосувати не виявило різниці.

Що для мене працювало:

  1. Як згадували інші, розгрупуйте все.
  2. Перетворити текстові об’єкти в шлях - це здавалося суттєвим у моєму випадку!
  3. Видаліть усі існуючі перетворення у редакторі xml та спостерігайте за тим, що відбувається із пов’язаними об’єктами. У моєму випадку відповідні елементи змінили своє положення.
  4. Виправте ці зміни вручну, але нічого не групуйте.
  5. Зберегти як звичайний svg (нормальний = оптимізація чи інші спеціальні настройки не використовувалися)

Добре працює, коли я використовую цей шаблон у FreeCAD.


Одна дивна деталь: Хоча моє рішення означає, що текстові елементи були проблемою в моєму випадку, це не може бути таким простим. Насправді базовий документ (той, на який я скопіював логотип) містить багато текстових елементів, і я не перетворив жоден із них. Тож це може бути поєднання "зовнішнього джерела" та елементів тексту. Я просто публікую цю деталь як підказку для інших, у кого можуть виникнути проблеми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.