Menghapus transformasi dalam file SVG


155

Saya telah berjuang dengan ini untuk sementara waktu, dan sepertinya tidak dapat menemukan jawaban (yang bekerja) di mana saja. Saya memiliki file SVG yang terlihat seperti ini:

<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>

Saya ingin menghapus transform="..."garis tetapi gambar saya tetap di tempat saya meletakkannya (di InkScape). Jika saya menghapus transformasi secara manual, gambar beralih ke bagian lain dari layar (seperti yang diharapkan), tetapi saya harus menyingkirkan transformasi secara bersamaan dan, pada saat yang sama, memiliki gambar tetap persis di tempat yang saya inginkan. Apakah ada cara untuk menghapus / meratakan transformasi ke jalur koordinat sendiri? (Satu-satunya transformasi yang harus saya tangani adalah menerjemahkan dan skala, tidak ada matriks.)



1
Tautan

Jawaban:


149

Cara menghapus transformasi di Inkscape

  1. Buka file svg di Inkscape
  2. Pergi ke Edit -> Editor XML
  3. Temukan "ubah" atribut dalam lapisan dan hapuslah

Cara memindahkan semua objek sama sekali tanpa membuat atribut transformasi lainnya

  1. Pergi ke Edit -> Pilih Semua di Semua Lapisan
  2. Pergi ke Objek -> Transform

    Di panel Transform

  3. Hapus centang Pindah relatif dan centang Terapkan ke setiap objek secara terpisah

  4. Tetapkan nilai Horizontal dan Vertikal sesuai dengan kebutuhan Anda dan klik Terapkan

16
Bekerja untukku. Objek harus tidak dikelompokkan sebelum ditransformasikan sehingga koordinat sebenarnya jalur diperbarui.
Rupert Angermeier

8
Hm, setelah mengaturnya ke 0 dan mengklik menerapkan transformasi muncul di editor XML lagi.
escapedcat

7
Membatalkan pengelompokan objek diperlukan agar ini bekerja untuk saya, terima kasih!
Hai Zhang

1
Tidak bekerja untuk saya. Ini akan meratakan dan memindahkan atribut transform ke daun (sebenarnya semuanya menjadi daun setelah dipisahkan), tetapi itu tidak akan MENGHAPUS atribut transform dan MENERAPKAN TI UNTUK MENITIKOM GEOMETRI, yang tanpanya saya kembali ke titik awal.
Szczepan Hołyszewski

2
PENTING: Seperti komentar yang dijelaskan di atas, Anda perlu memisahkan objek agar ini berfungsi dengan benar, jika tidak, atribut transformasi akan diatur kembali secara otomatis
Bayangan

52

Saya mencari tahu apa masalahnya. Aku berharap tidak harus menggunakan jawaban Robert, meskipun aku senang mendapat konfirmasi bahwa itu akan berhasil! Pada akhirnya jawaban Duopixel sebenarnya yang paling dekat, meskipun ternyata ada hal lain yang terjadi juga.

Saat Anda bekerja dengan jalur berbeda di dokumen Inkscape, saya yakin perilaku defaultnya adalah mengelompokkannya di bawah <svg:g.../>tag. Saat memodifikasi jalur dalam grup, Inkscape akan secara otomatis menambahkan transformasi ke grup untuk mewakili perubahan ini. Namun, jika Anda membuka editor XML dan menyeret jalur Anda di luar <svg:g.../>tag dan menjadikannya <svg:path.../>tag sendiri , Inkscape bebas untuk mengedit setiap poin sesuai keinginan. Pada akhirnya itu ternyata menjadi masalah pengelompokan meskipun saya hanya bekerja dengan satu jalur! Semoga ini bisa membantu orang lain dalam situasi serupa.


7
Luar biasa! Terima kasih! Itulah tepatnya yang dilakukannya. Saya baru saja menghapus tag grup yang meninggalkan konten dalam, menyimpannya, dan membukanya kembali di inkscape. Tentu saja gambar berada di luar kotak tampilan (atau apa pun namanya), tapi kemudian saya hanya mengatur x, y dan sudah diperbaiki. Sungguh menyakitkan. Terima kasih telah berbagi ini!
johntrepreneur

1
Dalam kasus saya, saya telah menggabungkan pendekatan dari jawaban ini dengan yang lain dari jawaban itu .
quasiyoke

Ini harus ditingkatkan dan dibawa ke atas. Ini menyelesaikan masalah dengan elegan dan berhasil untuk saya. Dan bahkan jika gambar salah tempat di luar kanvas, Anda selalu dapat mengubah ukurannya (Edit> Ubah Ukuran Halaman Untuk Seleksi)
mandarin

48

masukkan deskripsi gambar di sini

  1. Muat SVG Anda di Metode Draw http://editor.method.ac (File> Open Image)
  2. Batalkan pengelompokan elemen Anda (Obyek> Elemen pengelompokan) Anda mungkin harus melakukan ini lebih dari sekali.
  3. Pilih jalur Anda
  4. Reorientasi jalur (Objek> Jalur Reorientasi).
  5. Simpan gambar Anda (File> Simpan Gambar) Jika muncul di jendela baru Anda dapat mengklik kanan dan "Simpan Gambar sebagai ..."

1
Tidak ada Object> Reorient Paths. Versi apa yang Anda maksud?
0__

1
@ 0__ Jika item menu ini dinonaktifkan, berarti jalur Anda masih dalam grup. Ungroup lagi.
methodofaction

37

Ada ekstensi inkscape yang disebut Terapkan Transforms yang menghitung ulang jalur dengan transformasi mereka. Inilah yang sebenarnya saya cari.

Setelah menginstalnya, Anda akan menemukan menu itu di bawah Extensions> Modify Path> Apply Transform .


kredit: Forum Inkscape> Hapus semua transformasi sambil tetap di tempat


Ekstensi ini telah diperbarui dan sekarang berfungsi untuk rect juga, setidaknya dalam pengujian saya.
sil

Benar. Kekuatan yang diberikan plugin kecil ini tidak dapat diukur!
brett

23

Untuk kelompok, pengelompokan ulang dapat melakukan pekerjaan dengan cepat. Pilih grup dan tekan Ctrl + Shift + G (degroup) dan kemudian Ctrl + G (grup).

Untuk beberapa objek yang memiliki masalah yang sama, spiral dan bintang misalnya, cara cepat adalah dengan menekan Ctrl + Alt + C (stroke ke path) - ini mengubah objek menjadi path murni dan menghapus semua atribut ekstra, seperti sodipodi: cx, sodipodi: revolusi dan sebagainya.


23

Buka svg Anda di Inkscape :

  • Pilih grup yang berisi semua transformasi yang ingin Anda singkirkan
  • Tekan CTRL+U (ungroup)
  • Tekan CTRL+ G(kelompok lagi)

Dengan cara ini Anda akan menyingkirkan transformasi yang diterapkan ke grup dan mereka akan ditransfer ke jalur yang terkandung dalam grup ini.


1
Sempurna! Ini bekerja di Inkscape 1.0
Wizard of Ogz

14

Dalam pengalaman saya, jika Anda menggunakan Inkscape, cukup untuk memindahkan elemen path sedikit (misalnya dengan tombol kursor), dan Inkscape akan menghapus atribut transform dan menyesuaikan data path yang sesuai. (Mengganggu jika Anda benar-benar ingin mempertahankan atribut transformasi.)

Jadi, Anda cukup memilih jalur (pastikan itu jalur dan bukan grup sekitarnya), tekan tombol kursor kanan dan kiri, dan Anda selesai.


1
Ini sepertinya tidak berfungsi untuk elemen <g>. Saya mencoba untuk menyingkirkan atribut transform.
Max Spring

5
Mungkin coba ungrouping dulu dan regrouping sesudahnya.
Thomas W

1
Wow, bekerja seperti pesona! Ini harus menjadi jawaban yang diterima. Tidak perlu alat tambahan, tidak ada langkah rumit. Jawaban lain tidak berfungsi jika path bersarang dalam transformasi <g>dan saya ingin tetap mentransformasikannya pada <g>.
tomekwi

Tidak berfungsi untuk jalur yang dibuat oleh alat lingkaran, baik
sdaau

1
Jawaban terbaik Mungkin salah satu sumber kebingungan adalah opsi Preferensi> Transforms> Store Tranformations, yang tidak saya lihat disebutkan di tempat lain di sini. Ini harus diatur ke "dioptimalkan". Kemudian, hanya ungroup, move, re-group, dan dud transforms yang dihapus.
Mr5o1

13

Sementara saya lebih suka Inkscape, Affinity Designer (~ $ 40 / Mac) menyelamatkan saya berjam-jam ketika bekerja dengan Android Vector Drawables.

Buka SVG, File -> Ekspor -> SVG -> Lainnya -> Transformasi Flatten bekerja dengan baik.

Desainer Afinitas


12

SVGO adalah alat baris perintah sumber terbuka yang sangat baik untuk ini dan banyak optimisasi lainnya. Ada UI web online yang juga sangat baik untuk disebut SVGOMG

Opsi yang relevan dalam hal ini adalah moveGroupAttrsToElems(SVGOMG: Move group attrs to elements) untuk memindahkan transformatribut dari kelompok untuk elemen jalan, ditambah convertPathData(SVGOMG: Round/rewrite paths) untuk meratakan transformke d.


1
SVGO luar biasa. Ini harus benar-benar jawaban yang diterima, terutama karena stackoverflow adalah untuk sudut pandang programmer, dan sejauh ini merupakan solusi terbaik untuk seorang programmer mengembangkan situs yang mengandung SVGs. Menempatkan ini di saluran penyebaran Anda jauh lebih baik daripada harus mengajar seniman Anda untuk menghapus transformasi dengan tangan (atau harus melakukannya sendiri) dan mendapatkan laporan bug setiap kali mereka lupa
UTF_or_Death

3
Kecuali ini tidak berfungsi lagi. Saya ingat itu berfungsi lebih baik sekali, tetapi melihat masalah ini tentang fitur persis ini github.com/svg/svgo/issues/624 untuk SVGO
morewry

9

Harus disebutkan bahwa ada mode "Dioptimalkan" dalam preferensi:

Preferensi Inkscape> Transforms> Transformasi Store> Dioptimalkan

Yang seharusnya meminimalkan terjadinya transformatribut sebanyak mungkin, (tetapi tidak).

Ini sepertinya tetap aktif secara default.

Menurut diskusi , satu contoh di mana mode Dioptimalkan ini tidak memiliki semangat adalah ketika halaman diubah ukurannya . Ini menyebabkan translatetransformasi diterapkan pada <g>elemen layer . Tampaknya mengevakuasi anak-anak ke lapisan lain adalah solusi terbaik saat ini.


2
Untuk mengubah ukuran halaman tanpa membuat translatetransformasi menjengkelkan di setiap lapisan, coba buka .svgfile dalam editor teks dan memanipulasi atribut tinggi dan lebar yang muncul di bagian atas.
februaryInk

7

Inkscape memiliki opsi untuk menghapus data transformasi tetapi tetap membiarkan nilai objek tidak dimodifikasi.

Di Inkscape, pilih objek dan menu 'Path', 'Sederhanakan'. Sekarang, Anda akan menghapus transformasi.


16
Namun, itu akan mengubah garis besar jalur Anda, dan mengurangi jumlah simpul dalam bentuk kompleks.
Charlie

1
Ini sering membuat markup lebih besar dari sebelum transformasi.
Charlie

6

Dalam hal ini tambahkan saja terjemahan ke nilai m untuk setiap anak jadi -10.254587 + 10.75 = -0.504587 dan -308.96875 + 345.43597 = 36.46722.

Karena semua istilah dalam contoh adalah relatif (yaitu huruf kecil) itu saja. Jika ada yang absolut (huruf besar) misalnya M atau C mereka harus disesuaikan juga.

Untuk skala Anda pada dasarnya akan melipatgandakan semua nilai anak dengan skala.


Saya melakukan itu, tetapi dalam editor XML Inkspace (atau editor lainnya) transformasi masih ditambahkan. Aneh.
escapedcat

1
Dengan cara apa Anda akan menyesuaikan C jika Anda memiliki 2 subpath misalnya 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 dan M 3.0 5.0 C 2.4 5.5 3.3 6.4 5.0 7.0 Yang mana Anda ingin berubah menjadi satu jalur?
Pengaturan

@Anton menggunakan tombol ajukan pertanyaan jika Anda memiliki pertanyaan yang tidak tercakup oleh jawaban yang ada. Sulit untuk bertanya dan menjawab dalam komentar karena tersedia format yang sangat terbatas.
Robert Longson

2
@ RobertTongongson yah kau menutupinya. Yang saya inginkan adalah Anda menguraikan "Jika ada yang absolut (huruf besar) misalnya M atau C mereka harus disesuaikan juga."
Pengaturan

6
  1. Pilih elemen yang dimaksud
  2. Object> Ungroup (ulangi sampai semuanya ungrouped; lihat XML editor untuk nested nodes)
  3. Path> Object to Path (mengubah poligon menjadi path)
  4. Obyek> Transform> Hapus centang relatif pindah> Terapkan

Tampaknya tidak berfungsi di Inkscape 0.91. Itu<g> dengan transformatribut tetap seperti itu. Juga, objek saya (seperti yang ditunjukkan pada pertanyaan di sini) sudah menjadi path.
ATAU Mapper

Bisakah Anda menempelkan tautan ke SVG Anda?
Charlie

5

Untuk menghapus atribut transform dari gelemen (grup) di Inkscape, Anda bisa memindahkan grup ke tempat terakhirnya, memisahkan grup dan lalu mengelompokkan semua elemen. Sekarang grup baru telah dibuat, dan jika Anda tidak memindahkannya lagi, itu tidak akan mendapatkan atribut transformasi yang melekat padanya.


4

Jika ada yang mendarat di sini mencari solusi untuk melakukan ini di Sketch 3, pilih layer dan kemudian klik pada Layer-> Paths-> Flatten.


3

Menemukannya:

  • Tetapkan ukuran halaman yang Anda inginkan *
  • Jika layer Anda saat ini memiliki transformasi (periksa dengan editor XML, itu adalah grup teratas di bawah elemen SVG) lalu buat layer baru dan pindahkan semua objek ke sana
  • Batalkan pengelompokan grup apa pun (ini mungkin tidak diperlukan, YMMV)
  • Pilih semua objek dan terapkan transformasi nol (seperti skala 100% 100%, atau panah kanan + panah kiri) sambil memiliki transformasi Toko: Dioptimalkan dalam Preferensi / Transformasi
  • Jika Anda harus membatalkan grup apa pun, kini Anda dapat mengelompokkannya kembali
  • Simpan salinan sebagai Dioptimalkan SVG dan atur ketepatan angka yang Anda inginkan

*: Atau setidaknya tempatkan benda-benda di tempat yang Anda butuhkan, relatif ke sudut kiri atas halaman. Sangat disayangkan bahwa SVG koordinat referensi sudut kiri atas, sementara Inkscape mengubah ukuran halaman relatif ke kiri bawah!


Saya membutuhkan trik "pindah ke lapisan lain" karena transformasi yang ingin saya tekan adalah pada lapisan <g>. Sistem koordinat Inkscape cukup mengganggu.
Mutant Bob

3

Saya dapat menyingkirkan matrix(...)transformasi (karena mirroring) dengan menggabungkan jalan dengan persegi panjang dan kemudian menghapus node dari persegi panjang. Bagian translate(...)tetap.


Ini adalah satu-satunya solusi yang saya temukan juga. Gabungkan dengan jalur bersih baru, lalu lepaskan bagian yang tidak perlu.
Márton Tamás

2

Dalam kasus saya, menabung sebagai SVG yang dioptimalkan memecahkan masalah. Jadi dalam Inkscape gunakan:

File -> Simpan sebagai ... -> SVG Dioptimalkan.


Apa masalah Anda BTW? Saya datang ke sini setelah mencoba semuanya. Tapi masalahnya masih berlanjut.
Sahu V Kumar

@VishalKumarSahu Saya tidak bisa mengimpor ikon aplikasi Android (SVG) saya sebagai aset karena transformatribut tidak didukung oleh Android Studio.
Michał Stochmal

Yup dan itu kasus yang sama di web juga. Transform menciptakan masalah dalam output tetapi cukup membantu selama pengaturan objek sebagai grup. Saya harus melakukan perhitungan untuk menyelesaikan tujuan.
Sahu V Kumar

2

Ini berfungsi jika Anda menggunakan Inkscape:

  1. Pilih semuanya dan ungroup
  2. Simpan sebagai "Svg yang Dioptimalkan (* .svg)"

Dalam semua kasus yang saya coba, ini telah menghapus atribut transform apa pun. Tidak yakin apakah itu berfungsi untuk SVG yang lebih kompleks.


1

Saya mencoba solusi yang diposting di sini, yaitu untuk menghapus tag grup di file SVG dan membukanya kembali di Inkscape (0.48.3.1 dalam kasus saya). Sayangnya, setelah saya menerjemahkan path lagi menggunakan mode pilih dan ubah (F1) dan menyimpannya, tag grup muncul kembali! Inkscape menyimpan semua transformasi yang diterapkan ke jalur di elemen grup sekitarnya. Kecuali Anda menggunakan alat pemilihan jalur-simpul (F2), tekan ctrl + a dan pindahkan simpul jalur ke tempat yang tepat. Setelah saya melakukan ini sebagai gantinya dan menyimpan setelahnya Inkscape tidak menambahkan tag grup, karena terjemahan ini diterapkan langsung ke model jalur. Semoga ini membantu.


1

Dalam kasus saya grup sebenarnya disebabkan oleh lapisan. Menghapus semua lapisan dalam dokumen menghapus grup dan mentransformasikan (mungkin dikombinasikan dengan objek ungrouping dan menyusun kembali mereka dll seperti dalam Menghapus transformasi dalam file SVG (jawaban-35490189 dari @Charlie di atas))


0

Masalah khusus saya adalah dengan simbol yang didefinisikan di luar halaman, sehingga membutuhkan transformasi untuk ditampilkan pada halaman.

Untuk memindahkan simbol ke halaman tanpa memerlukan transformasi, saya harus melalui langkah-langkah ini di Inkscape:

  1. Buka jendela Symbols (Shift + Ctrl + Y)
  2. Hapus simbol dari pustaka dokumen. (Ada tombol untuk itu di jendela.)
  3. Sekarang gambar muncul di dokumen, di luar batas halaman.
  4. Pisahkan grup grafik. (Ini adalah langkah penting!)
  5. Pindahkan grafik di dalam batas halaman.
  6. Tambahkan grafik kembali ke perpustakaan simbol.

0

Ini tampaknya acak, tetapi tidak ada yang saya coba bekerja, jadi di sini Anda pergi orang lain secara acak. Beberapa jalur saya memiliki semacam margin di sekitar mereka yang hanya bisa dilihat ketika memilihnya ( contoh). Saya pikir ini dibuat ketika saya menyisipkan lapisan dari file inkscape lain dan memutarnya 90 derajat. Ini membuat pola mengisi pada bentuk memiliki transformasi yang berbeda (garis berjarak lebih jauh). Itu juga membuat menyelaraskan objek tidak berfungsi seperti yang diharapkan. Menggunakan Terapkan Transform yang disebutkan oleh @Piotr_cz memperbaiki masalah transformasi, tetapi margin aneh tetap. Saya tidak sengaja menyingkirkannya dengan mengubah Blur on Stroke ke nilai apa pun dan mengubahnya kembali ke nol.


0

Entah bagaimana saya tidak beruntung dengan pendekatan apa pun. Jika ada <defs>bagian dalam svg Anda dan penggunaan seperti ini:

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

Anda mungkin harus menghapus semua penggunaan dan mengeluarkan semuanya dari bagian defs. Kemudian, Anda dapat menggunakan inkscape untuk menempatkan semuanya dengan cara yang benar dan kemudian menerapkan transformasi menggunakan plugin yang disebutkan. Semoga ini bisa membantu seseorang.


0

Saya sudah memiliki masalah ini selama bertahun-tahun. Solusinya jelas untuk dapat bermain secara dinamis dengan transformasi di browser, jika tidak akan "diperbaiki" di inkscape.

Seorang pengguna Mc di forum Inkscape memberi saya solusi ini .

Solusi ini membangun transformasi saat ini antara elemen SVG dan elemen root SVG-nya, dan kemudian mengembalikan set lengkap informasi BBox berdasarkan total transformasi.

Mungkin juga untuk dengan mudah mengubah elemen penghitungan mana yang relatif, jika Anda ingin melakukan pekerjaan browser antara dua bagian dari file SVG yang sama.

Akhirnya saya benar-benar dapat memiliki viewport panning SVG.


0

Inkscape 1.0 di Kubuntu 20.04

Meskipun utas ini agak lama, saya ingin memposting pengalaman / solusi saya. Saya menemukan masalah ini ketika mencoba membuat template untuk meja kerja TechDrawing FreeCAD. Template ini tidak boleh mengandung transformasi apa pun.

Dalam kasus saya, saya harus menambahkan logo perusahaan dari file .svg eksternal (seluruhnya dibuat dengan Inkscape). Logo itu mengandung elemen grafis dan teks. Ketika menyalin logo itu ke dalam templat, transformasi dibuat, yang menyebabkan templat tersebut tidak berfungsi dengan benar di FreeCAD.

  • Pertama, solusi ini disarankan di www.freecadweb.org / ... tidak berfungsi untuk saya. Itu sebabnya saya mencari di web dan menemukan diskusi ini.

  • Kedua, tidak ada solusi yang disarankan di atas yang berhasil bagi saya, tetapi mereka menempatkan saya di jalur yang benar. Jawaban Charlie mendekati, tetapi Object> Transform> Hapus centang relatif bergerak> Terapkan tidak menunjukkan perbedaan.

Apa yang berhasil untuk saya adalah:

  1. Seperti yang disebutkan oleh orang lain, ungroup semuanya.
  2. Konversikan objek teks menjadi path - yang sepertinya penting dalam kasus saya!
  3. Hapus semua transformasi yang ada di xml-Editor dan amati apa yang terjadi dengan objek terkait. Dalam kasus saya, elemen terkait mengubah posisi mereka.
  4. Perbaiki perubahan ini secara manual tetapi jangan mengelompokkan apa pun.
  5. Simpan sebagai svg normal (normal = tidak ada optimasi atau pengaturan khusus lainnya digunakan)

Bekerja dengan baik ketika saya menggunakan template itu di FreeCAD.


Satu detail aneh: Meskipun solusi saya mengonotasikan bahwa elemen teks adalah masalah dalam kasus saya, tidak mungkin semudah itu. Bahkan, dokumen dasar (yang menjadi tujuan saya menyalin logo) berisi banyak elemen teks, dan saya tidak mengonversinya. Jadi bisa jadi kombinasi dari "sumber eksternal" dan elemen teks. Saya hanya memposting detail ini sebagai petunjuk kepada orang lain, yang mungkin memiliki masalah terkait.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.