Lưu nhiều đối tượng từ tệp vectơ vào các tệp riêng biệt bằng Inkscape / OS / Freeware


9

Tôi có một tệp vectơ tải xuống (định dạng AI). Các tập tin chứa hình ảnh vector đơn giản của các giống chó khác nhau. Tôi đã tải tệp trong inkscape, hủy nhóm chúng và muốn có một cách để lưu mỗi vectơ chó thành một tệp riêng biệt. Có cách nào để tự động hóa việc này với Inkscape hoặc một số công cụ OS / Freeware khác không? Nếu không, tôi sẽ phải chọn từng và lưu dưới dạng. Bất cứ sự giúp đỡ nào đều được đánh giá cao!

CẬP NHẬT Cảm ơn JSBueno về lời khuyên về việc chỉnh sửa tệp SVG thực tế. Tôi đã không nhận ra rằng SVG chỉ là một tệp XML. Tôi có thể dễ dàng đi qua tệp và xuất ra mỗi con chó dưới dạng một tệp riêng biệt. Điều này, nhân tiện, sẽ nhanh hơn nhiều so với thực hiện thông qua giao diện là mục tiêu của bài đăng này. Cảm ơn mọi người vì lời khuyên.


Tại sao bạn không thể chọn từng và lưu dưới dạng? Có thực sự rất nhiều hình ảnh mà một giải pháp tự động là bắt buộc?
Scott

2
Để có thể tự động hóa điều này, bạn phải có khả năng xác định các phần tử "dog" để trích xuất từ ​​tệp svg. Trong thực tế, các yếu tố con chó của bạn sẽ bao gồm các dòng ghép đơn cho đến các nhóm bị cắt xén. Tôi đề nghị bạn tìm hiểu các phím tắt cần thiết, chọn một số nhạc và tiếp tục với nó.

Vâng, tôi có hơn 80 đối tượng riêng lẻ cho cái này. Tôi chỉ tìm kiếm một cách nhanh hơn nhưng sẽ thực hiện thủ công nếu đó là những gì nó cần.
diley

Bạn chắc chắn có thể kịch bản đó. Chẳng hạn, sẽ cần một người thành thạo Python, ít nhất là thời gian cần thiết để "lưu là" 30 trong số 80 con chó của bạn để tạo ra một kịch bản như vậy. Một lập trình viên không có kỹ năng, hoặc thậm chí một người có kỹ năng nhưng không quen thuộc với các hàm helerp inkscape / XML có thể mất nhiều thời gian hơn nhiều so với việc cứu 80 con chó.
jsbueno

Cuối cùng, bạn chỉ có thể ghi tệp SVG trong trình soạn thảo văn bản (Notepad ++) và kiểm tra xem mỗi con chó có được chứa trong một thẻ SVG riêng không - tehm itis amatter sao chép / dán văn bản thay vì thực hiện với hình ảnh trên giao diện người dùng inkscape . Nó vẫn có thể nhanh hơn khi sử dụng giao diện người dùng inkscape.
jsbueno

Câu trả lời:


5

Có hai giải pháp mà tôi đã tìm thấy để xuất nhiều đối tượng từ Inkscape dưới dạng SVG. Các phương pháp này có lợi ích là các tập lệnh có thể chạy tự động và không cần chỉnh sửa SVG trong trình chỉnh sửa văn bản.

  1. svg-object-export

Kịch bản svg-object-export hoạt động bằng cách xuất tất cả các đối tượng dựa trên các biểu thức thông thường. Trong trường hợp của bạn, nó sẽ hoạt động bằng cách xuất tất cả các đối tượng với một ID cụ thể. Để sử dụng nó trước tiên hãy sao chép hoặc tải xuống tập lệnh từ Github .

Trong Inkscape, bạn cần thay đổi ID của tất cả các đối tượng bạn muốn xuất để có cùng một mẫu tên tệp. Để thực hiện việc này, mở hộp thoại Thuộc tính đối tượng bằng cách đi tới Đối tượng> Thuộc tính đối tượng hoặc nhấn Ctrl+ Shift+ O. Trong sự thay đổi trường ID chúng tất cả để có basename cùng một ID ví dụ Dog_1, Dog_2, Dog_3vv (đối tượng có thể không có cùng một ID).

nhập mô tả hình ảnh ở đây

Với tệp được lưu và tập lệnh được tải xuống, trong một thiết bị đầu cuối chạy lệnh sau

python svg-objects-export.py --pattern 'Dog_*' /path/to/your/file.svg

Điều này sẽ xuất tất cả các đối tượng với ID tên cơ sở "Dog_".

  1. inx-exportobjects

Phần mở rộng inkscape inxcape sẽ chỉ xuất tất cả các đối tượng được chọn. Để sử dụng nó trước tiên hãy sao chép hoặc tải xuống tiện ích mở rộng từ Gitlab . Để cài đặt nó sao chép các tập tin export_objects.inxexport_objects.pyđể .config/inkscape/extensions/. Trong Inkscape, bạn sẽ có một tùy chọn gọi là "Đối tượng cho tệp ..." trong Tiện ích mở rộng> Xuất khẩu. Chọn các đối tượng bạn muốn cài đặt và chọn tùy chọn này.

nhập mô tả hình ảnh ở đây

Trong hộp thoại này, chỉ cần thay đổi Thư mục xuất thành nơi bạn muốn lưu tệp của mình và thay đổi Tên cơ sở thành tên mới của tệp và sau đó nhấn Áp dụng.

nhập mô tả hình ảnh ở đây

Các tập tin sẽ được xuất sang thư mục được chỉ định của bạn.

Mỗi giải pháp có nhiều tùy chọn khác, chẳng hạn như xuất gif hoạt hình, mà bạn chắc chắn nên thử nghiệm.


Giải pháp tuyệt vời @hellocatfood Chỉ cần một mẹo: Trước khi xuất, bạn có thể thay đổi kích thước vải. Trong trường hợp của tôi, tôi đã có nhiều biểu tượng. Tôi đã tìm ra chiều rộng tối đa và chiều cao tối đa của các biểu tượng. Và sau đó thay đổi kích thước khung vẽ theo chiều cao x chiều rộng tương ứng. Tiếp theo, chọn tất cả các đối tượng và căn chỉnh chúng theo chiều ngang và chiều dọc, sau đó bắt đầu quá trình xuất. Bằng cách này, bạn sẽ có các Svg với chiều cao và chiều rộng phù hợp.
Anish Nair

1

Tùy thuộc vào điều kiện tiên quyết, rằng tất cả các đối tượng của bạn được nhóm lại và không được kết hợp thành các nhóm lớn hơn, đây là cách thực hiện. (Tôi đã sử dụng mèo trong ví dụ, vì chó không có sẵn).

nhập mô tả hình ảnh ở đây Ở phía dưới bên phải, bạn thấy một con mèo được tô sáng, đối tượng id 5358, là một đường dẫn duy nhất, vì vậy tôi đã thêm một tầng màu xanh lá cây sau đó đã thay đổi nó thành đối tượng 5364 sẽ xảy ra sau đó, vì vậy đừng nhầm lẫn với bạn. :)

Bạn nhận được trình soạn thảo xml bằng cách nhấn nút 4 từ bên phải (mũi tên 1).

Tôi đã thay đổi g5353 thành g-cat-5358 (trường 4) để giúp texttool dễ dàng chọn các đối tượng này hoạt động cho hầu hết các thành phần không va chạm với tên xml-svg (màu, meta, id, ... ).

Trong cửa sổ bên trái mà bạn thấy, đã có một thực thể được đổi tên, g-cat-5312 gần với đỉnh ở cùng mức thụt đầu dòng.

Inkscape tổ chức các id duy nhất cho các nhóm, nhưng chúng không cần phải ở dạng gNUMBER, bạn có thể trộn các ký tự khác. Chỉ cần không chọn một định danh đã tồn tại.

Sau khi thay đổi mã định danh, nhấn 'setzen (set)' (5) để xác nhận thay đổi của bạn. Bạn thấy một giao diện tiếng Đức ở đây, YMMV.

Lưu Svg (dưới dạng demo-cat.svg). Bây giờ chúng tôi chuyển sang kịch bản.

for cat in $( grep g-cat- demo-cats.svg )
do
  id=${cat//[^0-9]/}
  echo $id
  (head -n 53 demo-cats.svg; sed -n "/$cat/,/^    <\/g>/p" demo-cats.svg; echo "</svg>" ) > cat-${id}.svg
done

Nó làm gì? Nó greps (tìm kiếm bằng grep) cho mẫu "g-cat-" là phần bắt đầu của phần thú vị của chúng tôi. id=${cat//[^0-9]/}trích xuất id trong bash từ biểu thức. Echo in nó ra màn hình sẽ giúp tìm ra lỗi nếu có sự cố. head -n 53 demo-cat.svg lấy 53 dòng đầu tiên từ svg, trong đó có tất cả các Svg-cái nồi. Tùy thuộc vào cài đặt của bạn với các định dạng svg khác nhau (inkscape, nén, svg bình thường, inkscape-nén), điều này có thể khác nhau. Với nl demo-cats.svg | lessbạn có thể n umerate các l ines, để tìm điểm cắt đúng trong trường hợp của bạn.

  </metadata>
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1">
     <g

^ Đến phần này, các dòng nên được bao gồm.

Lệnh tiếp theo được thực hiện với s tream ed itor sed: sed -n "/$cat/,/^ <\/g>/p" demo-cats.svg;nói (-n) không in (nhưng) tìm kiếm nhóm mèo, cho đến thẻ đóng g ở mức 2 thụt vào trước 4 khoảng trống </g>nếu bạn không thay đổi tùy chọn Inkscape mà bạn có thể nhớ nếu đã làm. Sau đó thêm thẻ đóng cho svg : echo "</svg>". Viết đầu ra cho tệp 'cat- $ id.svg' (phần này ghi đè lên các tệp hiện có).

Vì vậy, tôi kết thúc với hai tệp: cat-5312.svg và cat-5364.svg.

Một giải pháp thanh lịch hơn nên có thể với xmlstarlet hoặc các công cụ tương tự, được thực hiện để tìm kiếm và chỉnh sửa các tệp xml. Thật không may, tôi không quen với nó và đã không làm cho nó hoạt động sau khi đọc 10 phút tài liệu. Bạn sẽ không cần phải đổi tên các nhóm ngay từ đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.