Tôi có thể chuyển đổi văn bản SVG thành đường dẫn nhưng sử dụng lại glyphs không?


14

Tôi có một SVG với một tải văn bản trên đó. Đó là một bản đồ bãi đậu xe với số không gian được viết trên đó. Tôi hiển thị điều này trong trình duyệt web và nhờ một lỗi nhỏ tuyệt vời trong Firefox , trình duyệt hiển thị văn bản không chính xác. Boo.

Vì vậy, tôi đã chuyển đổi văn bản thành đường dẫn. Chúng ta đang nói về tới 4000 nhãn riêng biệt. Có thể 15.000 hình dạng mới bây giờ là vectơ. Đó là 4 MB. Thông thường bạn có thể lập luận rằng điều này sẽ cho vay để nén nhưng tôi phải xếp hàng SVG này vào HTML . Tôi đang thêm các thay đổi CSS một cách linh hoạt và đây là cách duy nhất tôi có cơ hội hỗ trợ nhiều trình duyệt. Vì vậy, dù sao đi nữa, kết quả đầu ra của Sceveneven thô của điều này là quá lớn để có ích.

Điều gây ấn tượng với tôi ở đây là tất cả các số không gian này chia sẻ glyphs phổ biến. Không qua chín. Tại sao tôi bao gồm một định nghĩa hình dạng cho mọi trường hợp của mọi số? Tôi có thể sao chép lại những thứ này không?

Tôi đang sử dụng Inkscape nhưng tôi mở để đề xuất.


Bất kỳ cơ hội nào bạn có thể chia sẻ tệp SVG để chúng tôi có thể thử nghiệm với nó?
JohnB

1
Lỗi chính xác là gì (ảnh chụp màn hình) và cách bạn xuất và tải nó lên trình duyệt? Có một cơ hội tốt bạn có thể sửa nó chỉ bằng một số kiểu CSS hoặc một đoạn script nhỏ vào trang để sửa / thay thế các thành phần văn bản. Nếu đây là màn hình bản đồ động, bạn có thể muốn biến nó thành bản đồ thực tế - hầu hết các thư viện ánh xạ trình duyệt (và nhiều thư viện dựa trên dữ liệu) đều hỗ trợ rất tốt cho việc dán nhãn.
brichins

1
Xin lỗi, SVG không phải là của tôi để chia sẻ (nó thuộc về một khách hàng) nhưng lỗi đã được biết đến . Về cơ bản, điều đó có nghĩa là các phông chữ trong SVG sẽ không giảm xuống một điểm ... Đây là một vấn đề nghiêm trọng nếu bạn thu nhỏ toàn bộ trên bản đồ với hàng ngàn chỗ đậu xe được đánh số. Chúng phải là (ví dụ) ~ 0,08pt và chúng thực sự là 13pt.
Oli

1
Bạn đã nhầm số lỗi, bạn thực sự đang tìm kiếm cái này
Robert Longson

Bạn có thể muốn kiểm tra điều này trên một tập hợp con, nhưng có thể path|simplifygiúp bạn chút nào không? Chữ "s" chữ thường chuyển đổi thành đường dẫn 28 điểm, đơn giản hóa việc cắt nó thành 17 và phủ lên các phiên bản đơn giản và không thể chỉnh sửa thậm chí được phóng to để một "s" lấp đầy màn hình không có sự khác biệt.
Chris H

Câu trả lời:


6

Phần <use>tử cho phép bạn sử dụng lại các đối tượng được xác định ở nơi khác trong tài liệu. Ví dụ: bạn có thể định nghĩa mỗi glyph là a <symbol>và sau đó sử dụng lại chúng nhiều lần. Dưới đây là một bài viết tốt đẹp về nó: Cấu trúc, Nhóm, và tham khảo trong SVG - Các <g>, <use>, <defs><symbol>yếu tố .

Tuy nhiên, tôi không biết làm thế nào để làm điều đó trực tiếp trong Inkscape - đặc biệt là không phải với một loạt các văn bản bạn đã có dưới dạng văn bản. Bạn có thể phải viết một tập lệnh để xử lý hậu kỳ SVG và tìm tất cả các đường dẫn có thể được sử dụng lại.


Đó <use>là những gì tôi đã suy nghĩ khi tôi hỏi điều này, kịch bản là như thế nào. Có vẻ ngớ ngẩn rằng không có gì ngoài đó để sao chép đánh dấu gần giống hệt nhau.
Oli

@Oli thậm chí không có gì để khấu trừ đánh dấu giống hệt nhau ; Tôi đã phải tự viết (và giống hệt tôi có nghĩa là byte; tôi đã băm chúng và so sánh các giá trị băm)
Chris H

Tôi đã có một suy nghĩ trong bữa trưa, và cảm giác với tôi như một kịch bản (trăn) trong inkscape sẽ là cách để đi. Kịch bản sẽ bắt đầu bằng văn bản dưới dạng văn bản và thay thế nó bằng các tham chiếu đến <symbol>s (hoặc có vẻ như bạn có thể <def>glyphs chuyển văn bản của bạn
Chris H

4

Có một số tùy chọn nén có sẵn sẽ cung cấp mức độ thành công khác nhau. Để kiểm tra chúng, tôi đã tạo một tệp ảnh nghệ thuật chỉ có nhiều văn bản lặp đi lặp lại. Không được mở rộng, kích thước tệp là 13,8 KB. Mở rộng, kích thước tệp là 1,42 MB .

Tùy chọn tốt: Sử dụng SVGZ - 46,5 KB

Lưu tác phẩm nghệ thuật mở rộng khi SVGZ cho tôi tệp đầu ra 46,5 KB nhỏ hơn đáng kể so với SVG tiêu chuẩn. Hãy lưu ý rằng sự hỗ trợ có thể thay đổi .

Tùy chọn tốt hơn: Nén bằng Scour - 21,1 KB

Scour là một công cụ sẽ xóa và tối ưu hóa tệp SVG cho bạn. Sử dụng lệnh "nén tối đa" của scour -i input.svg -o output.svgz --enable-viewboxing --enable-id-stripping --enable-comment-stripping --shorten-ids --indent=none, tác phẩm nghệ thuật mở rộng đã giảm xuống còn 21,1 KB. Không xa với kích thước tập tin ban đầu chưa được mở rộng!


3
Scouring không nén, nó chỉ loại bỏ rác và trong khi nó mang lại lợi ích khá lớn cho tôi (với số lượng lớn các đối tượng), "4MB" của tôi là hậu kỳ. Nội dung được nén sẽ rất tuyệt vời nhưng tôi nên đề cập đến vấn đề này trước đó. Tôi phải đặt nội dung SVG cho các vấn đề nhắm mục tiêu của trình duyệt (và cả các yêu cầu thao tác trước). Tôi biết, tôi biết, điều đó thật đau đớn nhưng hãy tin tôi khi tôi nói rằng điều đó làm tôi đau đớn hơn vào lúc này D:
Oli

Tôi nên nói, phần cọ rửa của scourkhông nén. Nó cũng có thể ném tệp qua gzip cho bạn nhưng ID và công cụ thu nhỏ khoảng trắng là hợp đồng biểu diễn chính của nó.
Oli

@Oli đúng, do đó tôi cẩn thận lựa chọn từ "tối ưu hóa" :) Đó là một người lập dị rằng tập tin của bạn đã được quét mặc dù ... ack!
JohnB

Tôi loay hoay trong Illustrator một chút; đầu ra SVG của nó không tôn trọng các Biểu tượng. Đây là một ví dụ nhanh . Sẽ mất khá nhiều nỗ lực, nhưng bạn có thể tạo một tập lệnh Illustrator để tách văn bản của bạn thành các ký tự riêng lẻ và thay thế chúng bằng các Biểu tượng. Rào cản lớn nhất tôi thấy sẽ là đối phó với xoay vòng. Nếu tất cả văn bản song song với trục X thì điều đó dường như không khó, nhưng xử lý văn bản trên một góc có thể là một thách thức. Tất nhiên, tất cả những thứ đó không hữu ích nếu bạn không có sẵn Illustrator
JohnB

3

Đây là một giải pháp trên trình duyệt hoặc trên máy chủ

Có nhiều cách khác nhau để tối ưu hóa các tệp SVG. Âm thanh như bạn đã thực hiện một chút công bằng của nó.

Một vài tài nguyên mà tôi thấy rất hữu ích là một bài viết về thủ thuật tập trung vào các chi tiết rất cụ thể. Và đặc biệt, công cụ mà nó sử dụng SVGO .

Nếu bạn có nhiều đường dẫn lặp đi lặp lại, tôi sẽ xem xét sử dụng javascript để tạo các hình dạng Động. Có một ví dụ ở đây . Một hướng sẽ là có một hàm được xác định cho mỗi glyph và chỉ cần có mỗi đường dẫn trong phần tử svg được tạo bởi một yêu cầu cho hàm đó. Hoặc lấy một chuỗi đầy đủ và / hoặc mảng các đối số, để tạo svg nội tuyến của bạn. Tất nhiên, điều này hy vọng rằng các đường dẫn của bạn dài hơn độ dài của mã cần thiết để yêu cầu chức năng đã nói (giả định khá dễ dàng).


1
Trong khi câu trả lời này trình bày nhiều giải pháp khả thi, thì SVGO có vẻ thú vị nhất. Nó cũng có thể được chạy trên tệp .svg để tối ưu hóa nó. Tuy nhiên, nó dường như không làm trùng lặp đường dẫn. Nếu người hỏi cuối cùng vẫn thực hiện kịch bản tùy chỉnh, thì thực hiện nó như là một sự nâng cao cho SVGO có thể là một ý tưởng tốt.
JPA

@jpa khấu trừ trước (hoặc trong khi) chuyển đổi sang đường dẫn, chắc chắn sẽ là cách để đi. Thay thế tất cả các trường hợp của văn bản char "1" với <use xlink:href="#digit_one">nơi digit_onelà một con đường
Chris H

@ChrisH Tôi không thể hiểu tại sao người ta không thể khấu trừ sau đó. Chỉ cần bình thường hóa tất cả các đường dẫn đến điểm gốc tại điểm bắt đầu, lấy hàm băm, sử dụng nó để tìm xem đường dẫn đã xảy ra chưa. Chắc chắn, không thanh lịch, nhưng nên hoạt động và có thể dễ thực hiện hơn là phải thực hiện lại / tìm ra tất cả logic bố cục văn bản.
JPA

@jpa bạn có thể, nhưng nếu bình thường hóa lỗi làm tròn gốc được giới thiệu, hàm băm sẽ không khớp. Kịch bản mà tôi nghĩ sẽ gọi đường dẫn văn bản của inkscape để bố trí các đường dẫn ký tự nhưng sau đó thay thế chúng bằng các tham chiếu đến một tập hợp các bậc thầy.
Chris H

@jpa và các lỗi làm tròn là có thật. Trên một ví dụ về đồ chơi, đường cong bậc hai đầu tiên của số 0 khác 1 ở vị trí thập phân thứ sáu - đủ để làm hỏng việc băm
Chris H

2

Ở đây ở mức rất cao là những gì kịch bản của bạn nên làm. Hãy sử dụng ngôn ngữ và môi trường ưa thích của bạn, đây chỉ là điểm khởi đầu cho logic sẽ cung cấp cho bạn những gì bạn đang tìm kiếm.

  • Lặp lại tất cả các thành phần văn bản trong xml của SVG và đối với những yếu tố có văn bản số (điểm đỗ xe, bạn không chỉ định nếu có thêm văn bản trong svg của mình), hãy thay đổi id tự động được tạo bởi Inkscape thành chuỗi có chỗ đậu xe đó số tại chỗ. Inkscape chỉ cần ID duy nhất, nó tạo ID không mô tả nhưng sẽ tôn trọng và không thay đổi ID được tạo bởi phần mềm khác hoặc do người dùng tạo hoặc thay đổi theo cách thủ công.
  • Trong bảng lưu trữ tọa độ x & y của thành phần văn bản của từng vị trí đỗ xe.
  • Cho dù trong Inkscape hoặc bằng cách viết kịch bản, hãy chuyển đổi tất cả văn bản tại chỗ đỗ xe thành đường dẫn.
  • Đối với các chữ số 0-9, hãy thêm vào tệp SVG một <defs>phần thích hợp xác định thông tin đường dẫn cho mỗi chữ số.
  • Vòng qua tất cả các <g>điểm đỗ xe và thay thế chúng bằng một<use xlink:href="#digit" x=x y=y />
  • Lợi nhuận

Tôi có thể thấy trước một số biến chứng mà bạn sẽ phải đối phó và chúc may mắn với những điều đó.

  • Vòng lặp sẽ cần phải phân tách chuỗi điểm đỗ xe có 2 chữ số trở lên và khoảng cách thích hợp giữa chữ số đầu tiên và chữ số tiếp theo có thể khó khăn; điều này sẽ phụ thuộc nhiều vào phông chữ bạn đang sử dụng.
  • Bạn không chỉ định hướng các điểm đỗ xe ở hướng nào hoặc nếu chúng thậm chí nằm trên các thiết lập cong. Do hướng dẫn sử dụng x, y bù cho các số có 2 chữ số trở lên, bạn có thể cần logic bổ sung để tìm ra 'hướng' của vị trí đỗ xe và cách sắp xếp chính xác các đường dẫn khác nhau của các chữ số đầu tiên.

Hi vọng điêu nay co ich. Chúc may mắn.

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.