Pangkas gambar SVG ke ukuran kanvas di baris perintah


9

Saya memiliki gambar SVG yang diproduksi oleh PlantUML, yang memiliki beberapa bagian gambar di luar kanvas. Itu membuatnya sulit untuk menggunakan gambar seperti itu dan saya perlu memotong gambar ke ukuran kanvas. Ketika saya menghasilkan diagram UML dengan skrip, saya akan sangat efisien untuk melakukan pemotongan di sana.

Sejauh ini saya sudah mencoba dua hal: a) mengubah ukuran kanvas untuk menggambar dengan Inkscape

inkscape --verb=FitCanvasToDrawing --verb=FileSave --verb=FileClose *.svg

Ini berfungsi dengan baik, tapi saya perlu memotong gambar ke ukuran kanvas dan operasi ini sepertinya tidak tersedia.

b) mengubah ukuran dengan rsvg-convert

rsvg-convert image.svg -w 1870 -h 1195 -f svg -o image.svg

Ini benar-benar memotong ke ukuran yang diinginkan, tetapi ukuran gambar meningkat ~ 10 kali karena sekarang ada beberapa gambar biner yang tertanam dalam SVG. Ini tidak dapat diterima untuk saya.


Bukan jawaban, hanya saran (saya tidak mencari spesifikasi sekarang). svgformat adalah format ascii berbasis xml, jadi cara termudah seharusnya hanya menggunakan sedatau alat manipulasi teks favorit Anda untuk menyisipkan atau memodifikasi garis yang menetapkan kotak pembatas. Ini bahkan tidak akan menyentuh konten file lainnya. Coba lakukan secara manual sekali pada contoh file svg (dalam editor teks) dan kemudian terjemahkan tindakan Anda menjadi skrip.
orion

Ukuran kanvas baik-baik saja. Saya harus memotong semua teks, garis, dan persegi panjang, yang memiliki bagian di luar kanvas. Itu membutuhkan membandingkan kotak pembatas mereka dan dengan kotak kanvas. Ini cara untuk banyak hanya dengan skrip shell.
divanov

1
Oh ... Saya ingat saya marah pada inkscape mengapa tidak melakukannya. Bahkan ada laporan bug yang terlibat. Mereka tidak melakukan apa-apa saat itu. Juga, tidak ada alat standar untuk menghapus hal-hal yang tidak terlihat di luar batas dari file pdf (Acrobat Pro tentu saja adalah salah satu yang terburuk di sini). Namun, jika Anda hanya ingin klip hal-hal yang terlihat sebagian, Anda dapat mengelompokkan seluruh konten dan menempatkan klip berukuran kotak terikat di atas segalanya. Mereka masih dalam file, dan mereka masih memakan tempat.
orion

Terima kasih atas sarannya. Mengubah xml dengan sed sedikit berbahaya, tetapi masih lebih baik daripada mengedit manual.
divanov

Jawaban:


5

Saya menemukan cara yang salah untuk melakukannya dengan menggunakan proposal orion. Dengan asumsi $svg_file_nameadalah variabel yang berisi jalur file ke gambar SVG.

Pertama kita perlu lebar dan tinggi gambar

width=$(exiftool -ImageWidth $svg_file_name | sed "s/.*: //;s/pt//g")
height=$(exiftool -ImageHeight $svg_file_name | sed "s/.*: //;s/pt//g")

PlantUML menghasilkan diagram sebagai satu kelompok (tag <g>), mari kita tempatkan persegi panjang ukuran kanvas di atas kelompok itu

sed -i "s|</g>|</g><polygon fill=\"#FFFFFF\" points=\"0,0,0,$height,$width,$height,$width,0\" style=\"stroke: #000000; stroke-width: 1.0;\"/>|" $svg_file_name

Sekarang buka gambar dengan inkscape, pilih semua dan klip grup dengan persegi panjang

inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileClose $svg_file_name

Dengan Inkscape terbaru kita harus keluar dari Inkscape alih-alih menutup file

inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileQuit $svg_file_name

Perhatikan bahwa beberapa svgs mungkin menggunakan unit "mm" dan viewBox. Maka tinggi dan lebar perlu disesuaikan sesuai dengan penskalaan. Info lebih lanjut di sini .
jmiserez
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.