ฉันสามารถแปลงข้อความ SVG เป็นเส้นทาง แต่ใช้ glyphs ซ้ำได้หรือไม่


14

ฉันมี SVG พร้อมข้อความจำนวนหนึ่ง มันเป็นแผนที่ที่จอดรถที่มีหมายเลขช่องว่างเขียนอยู่ ฉันแสดงสิ่งนี้ในเว็บเบราว์เซอร์และขอบคุณข้อผิดพลาดเล็ก ๆ น้อย ๆ ที่ยอดเยี่ยมใน Firefoxเบราว์เซอร์ทำให้ข้อความไม่ถูกต้อง หุยฮา

ดังนั้นฉันจึงแปลงข้อความเป็นเส้นทาง เรากำลังพูดถึงป้ายกำกับแยกกันมากถึง 4,000 รายการ บางที 15,000 รูปร่างใหม่ตอนนี้เป็นเวกเตอร์ มันคือ 4MB ปกติคุณอาจจะเถียงเรื่องนี้จะให้ยืมตัวไปอัด แต่ฉันต้องในบรรทัด SVG นี้ในรูปแบบ HTML ฉันกำลังเพิ่มการเปลี่ยนแปลง CSS แบบไดนามิกและเป็นวิธีเดียวที่ฉันมีโอกาสได้รับการสนับสนุนข้ามเบราว์เซอร์ ดังนั้นวัตถุดิบที่สิบเอ็ดถูกขัดเอาท์พุทของสิ่งนี้ใหญ่เกินไปที่จะเป็นประโยชน์

สิ่งที่กระทบฉันที่นี่คือจำนวนพื้นที่ทั้งหมดเหล่านี้มีร่ายมนตร์ร่วมกัน ศูนย์ถึงเก้า เหตุใดฉันจึงต้องรวมคำจำกัดความของรูปร่างสำหรับทุกอินสแตนซ์ของทุกหมายเลข ฉันสามารถทำซ้ำสิ่งเหล่านี้ได้หรือไม่

ฉันใช้ Inkscape แต่ฉันเปิดรับข้อเสนอแนะ


โอกาสใดที่คุณสามารถแชร์ไฟล์ SVG เพื่อให้เราสามารถทดลองกับมันได้
JohnB

1
ข้อผิดพลาดคืออะไร (ภาพหน้าจอ) และคุณจะส่งออกและโหลดไปยังเบราว์เซอร์อย่างไร มีโอกาสที่ดีที่คุณสามารถแก้ไขได้ด้วยการกำหนดสไตล์ CSS เพียงบางส่วนหรือสคริปต์ขนาดเล็กไปยังหน้าเพื่อแก้ไข / แทนที่องค์ประกอบข้อความ หากนี่คือการแสดงแผนที่แบบไดนามิกคุณอาจต้องการเปลี่ยนให้เป็นแผนที่จริง - ไลบรารีการทำแผนที่เบราว์เซอร์ส่วนใหญ่
brichins

1
ขออภัย SVG ไม่ได้เป็นเหมืองหุ้น (มันเป็นของลูกค้า) แต่ข้อผิดพลาดที่เป็นที่รู้จักกันเกี่ยวกับ นั่นหมายความว่าแบบอักษรใน SVG จะไม่ลดขนาดลงไปอีก ... ซึ่งเป็นปัญหาร้ายแรงหากคุณซูมออกจนสุดบนแผนที่พร้อมที่จอดรถนับพัน ควรเป็น (เช่น) ~ 0.08pt และจริง ๆ แล้ว 13pt
Oli

1
คุณมีหมายเลขบั๊กผิดจริง ๆ แล้วคุณกำลังมองหาอันนี้อยู่
Robert Longson

คุณอาจต้องการทดสอบสิ่งนี้ในชุดย่อย แต่สามารถpath|simplifyช่วยคุณได้บ้าง? ตัวอักษรตัวเล็กแปลงเป็นเส้นทาง 28 จุดลดความซับซ้อนของมันลงเหลือ 17 และซ้อนทับเวอร์ชั่นที่ไม่ซับซ้อนและไม่ได้ขยายแม้แต่การซูม
Chris H

คำตอบ:


6

<use>องค์ประกอบช่วยให้คุณสามารถนำมาใช้ใหม่วัตถุที่กำหนดไว้ที่อื่น ๆ ในเอกสาร ตัวอย่างเช่นคุณสามารถกำหนดสัญลักษณ์แต่ละอันเป็น a <symbol>แล้วนำมาใช้ซ้ำได้หลายครั้ง นี่เป็นบทความที่ดีเกี่ยวกับมันโครงสร้าง, การจัดกลุ่มและการอ้างอิงใน SVG - The <g>, <use>, <defs>และ<symbol>องค์ประกอบ

ฉันไม่รู้วิธีการทำเช่นนั้นโดยตรงใน Inkscape - โดยเฉพาะอย่างยิ่งไม่ใช่สำหรับข้อความกลุ่มที่คุณมีเป็นข้อความอยู่แล้ว คุณอาจต้องเขียนสคริปต์เพื่อดำเนินการ SVG และค้นหาเส้นทางทั้งหมดที่สามารถนำกลับมาใช้ใหม่ได้


นั่น<use>คือสิ่งที่ฉันคิดเมื่อฉันถามสิ่งนี้สคริปต์เป็นวิธีการ ดูเหมือนว่าโง่ที่ไม่มีอะไรจะทำซ้ำมาร์คอัปที่ใกล้เคียงกัน
Oli

@Oli ไม่มีอะไรที่จะทำซ้ำมาร์กอัปซ้ำซ้อน ฉันต้องเขียนของตัวเอง (และเหมือนกันฉันหมายถึง byte; ฉันแฮชพวกเขาและเปรียบเทียบแฮช)
Chris H

ฉันมีความคิดเกี่ยวกับอาหารกลางวันและฉันรู้สึกเหมือนสคริปต์ (หลาม) ใน inkscape จะเป็นวิธีที่จะไป สคริปต์จะเริ่มต้นด้วยข้อความเป็นข้อความและแทนที่ด้วยการอ้างอิงถึง<symbol>s (หรือดูเหมือนว่าคุณสามารถ<def>ร่ายมนตร์ข้อความต่อเส้นทางของคุณ
Chris H

4

มีตัวเลือกการบีบอัดที่พร้อมใช้งานซึ่งจะนำเสนอระดับความสำเร็จที่แตกต่างกัน เพื่อทดสอบพวกเขาฉันสร้างไฟล์อาร์ตเวิร์คที่มีข้อความซ้ำจำนวนมากเพียงอย่างเดียว ไม่ขยายไฟล์ขนาด 13.8 KB ขยายขนาดของไฟล์1.42 MB

ตัวเลือกที่ดี: ใช้ SVGZ - 46.5 KB

การบันทึกงานศิลปะแบบขยายเนื่องจาก SVGZ ให้ไฟล์เอาต์พุต 46.5 KB ซึ่งมีขนาดเล็กกว่า SVG มาตรฐานอย่างมาก รับทราบว่าที่สนับสนุนอาจแตกต่างกัน

ตัวเลือกที่ดีกว่า: บีบอัดด้วย Scour - 21.1 KB

กัดเซาะเป็นเครื่องมือที่จะขัดและเพิ่มประสิทธิภาพไฟล์ SVG ของคุณสำหรับคุณ การใช้คำสั่ง "การบีบอัดสูงสุด" ของscour -i input.svg -o output.svgz --enable-viewboxing --enable-id-stripping --enable-comment-stripping --shorten-ids --indent=noneงานศิลปะที่ขยายเพิ่มจะลดลงเป็น 21.1 KB ไม่ไกลจากขนาดไฟล์ดั้งเดิมที่ยังไม่ขยาย!


3
กำจัดสิ่งสกปรกบนไม่ได้บีบอัดก็แค่เอาขยะและในขณะที่มันไม่ทำยุติธรรมจำนวนที่ดีสำหรับฉัน (กำหนดขนาดใหญ่จำนวนของวัตถุ) ฉัน "4MB" เป็นโพสต์กัดเซาะ เนื้อหาที่บีบอัดจะดีมาก แต่ - และฉันควรจะพูดถึงเรื่องนี้ก่อนหน้านี้ - ฉันต้องใส่ SVG สำหรับปัญหาการกำหนดเป้าหมายเบราว์เซอร์ (รวมถึงข้อกำหนดการจัดการส่วนหน้า) ฉันรู้ฉันรู้ว่ามันเจ็บปวด แต่เชื่อฉันเมื่อฉันบอกว่ามันทำร้ายฉันมากขึ้นในขณะนี้ D:
Oli

ฉันควรจะพูดว่าส่วนที่เป็นสิ่งสกปรกของscourไม่บีบอัด นอกจากนี้ยังสามารถโยนไฟล์ผ่าน gzip สำหรับคุณ แต่สิ่งที่ ID และช่องว่างการลดขนาดเป็นกิ๊กหลักของมัน
Oli

@Oli ถูกต้องดังนั้นฉันจึงระมัดระวังในการเลือกคำว่า "เพิ่มประสิทธิภาพ" :) มันช่างน่าเสียดายที่ไฟล์ของคุณถูกกำจัดแล้วแม้ว่า ...
JohnB

ฉันเล่นไปรอบ ๆ ใน Illustrator เอาต์พุต SVG ของมันไม่เป็นไปตามสัญลักษณ์ นี่เป็นตัวอย่างรวดเร็ว อาจต้องใช้ความพยายามสักหน่อย แต่คุณอาจสร้างสคริปต์ Illustrator ที่จะแยกข้อความของคุณออกเป็นอักขระแต่ละตัวและแทนที่ด้วย Symbols อุปสรรค์ที่ใหญ่ที่สุดที่ฉันเห็นจะเกี่ยวข้องกับการหมุน หากข้อความทั้งหมดขนานกับแกน X ดูเหมือนจะไม่ยาก แต่การจัดการกับข้อความในมุมอาจเป็นเรื่องที่ท้าทาย แน่นอนสิ่งที่ไม่เป็นประโยชน์มากหากคุณไม่มี Illustrator
JohnB

3

นี่คือในเบราว์เซอร์หรือโซลูชั่นเซิร์ฟเวอร์

มีหลายวิธีในการเพิ่มประสิทธิภาพไฟล์ SVG ฟังดูเหมือนคุณทำมาแล้ว

แหล่งข้อมูลไม่กี่แห่งที่ฉันพบว่ามีประโยชน์มากเป็นบทความ css-tricksที่เน้นรายละเอียดเฉพาะมาก และโดยเฉพาะเครื่องมือที่ใช้SVGO

หากคุณมีเส้นทางซ้ำหลายครั้งฉันจะพิจารณาใช้จาวาสคริปต์เพื่อสร้างรูปร่างแบบไดนามิก มีตัวอย่างเป็นที่นี่ ทิศทางเดียวคือการมีฟังก์ชั่นที่กำหนดไว้สำหรับแต่ละสัญลักษณ์และมีแต่ละเส้นทางภายในองค์ประกอบ svg ที่สร้างขึ้นโดยการร้องขอสำหรับฟังก์ชันนั้น หรือรับค่าสตริงเต็มและ / หรืออาเรย์ของอาร์กิวเมนต์เพื่อสร้างอินไลน์ svg ของคุณ แน่นอนว่าสิ่งนี้คาดว่าเส้นทางของคุณจะยาวเกินความยาวของรหัสที่ต้องใช้ในการขอฟังก์ชั่นที่กล่าวมา


1
ในขณะที่คำตอบนี้นำเสนอแนวทางแก้ไขที่เป็นไปได้หลายวิธี SVGO ดูเหมือนน่าสนใจที่สุด มันสามารถใช้กับไฟล์. svg เพื่อปรับให้เหมาะสม อย่างไรก็ตามมันดูเหมือนจะไม่ทำซ้ำเส้นทางในปัจจุบัน หากผู้ถามจบลงด้วยการทำสคริปต์ที่กำหนดเองการทำเช่นนั้นเพื่อปรับปรุง SVGO อาจเป็นความคิดที่ดี
jpa

@jpa deduping ก่อน (หรือขณะ) แปลงเป็นเส้นทางจะเป็นวิธีที่จะไปแน่นอน แทนที่อินสแตนซ์ทั้งหมดของ text char "1" ด้วย <use xlink:href="#digit_one">ตำแหน่งที่digit_oneเป็นเส้นทาง
Chris H

@ ChrisH ฉันไม่สามารถเห็นได้ว่าทำไมไม่มีใครสามารถหักเงินได้ในภายหลังเช่นกัน เพียงทำให้เส้นทางทั้งหมดเป็นปกติที่จุดเริ่มต้นใช้แฮชใช้เส้นทางนั้นเพื่อค้นหาว่าเส้นทางนั้นเกิดขึ้นแล้วหรือไม่ แน่นอนว่าไม่หรูหรา แต่ควรใช้งานได้และสามารถนำไปใช้งานได้ง่ายกว่าการปรับใช้ / คิดตรรกะตรรกะโครงร่างข้อความใหม่ทั้งหมด
jpa

@ jpa คุณสามารถทำได้ แต่หากการทำให้ค่าความผิดพลาดในการปัดเศษเป็นปกติการแฮชจะไม่ตรงกัน สคริปต์ที่ฉันคิดว่าจะเรียกใช้ text-to-path ของ inkscape เพื่อกำหนดเส้นทางของอักขระ แต่แทนที่ด้วยการอ้างอิงไปยังชุดของเจ้านาย
Chris H

@jpa และข้อผิดพลาดในการปัดเศษเป็นจริง ในตัวอย่างของเล่นเส้นโค้งกำลังสองแรกของศูนย์จะแตกต่างกัน 1 ในตำแหน่งทศนิยมที่หก - เพียงพอที่จะทำให้เกิดการคร่ำครวญ
Chris H

2

ที่นี่ในระดับสูงมากเป็นสิ่งที่สคริปต์ของคุณควรทำ อย่าลังเลที่จะใช้ภาษาและสภาพแวดล้อมที่คุณต้องการนี่เป็นเพียงจุดเริ่มต้นสำหรับตรรกะที่ควรให้สิ่งที่คุณกำลังมองหา

  • วนรอบองค์ประกอบข้อความทั้งหมดใน xml ของ SVG และสำหรับองค์ประกอบที่มีข้อความเป็นตัวเลข (จุดจอดรถคุณไม่ได้ระบุว่ามีข้อความใน svg ของคุณมากขึ้น) เปลี่ยน id ที่สร้างขึ้นโดย Inkscape เป็นสตริงด้วยการจอดรถนั้น หมายเลขของจุด Inkscape ต้องการเฉพาะ ID ที่ไม่ซ้ำกันมันสร้างรหัสที่ไม่ใช่คำอธิบาย แต่จะเคารพและไม่เปลี่ยนรหัสที่สร้างขึ้นโดยซอฟต์แวร์อื่น ๆ หรือสร้างหรือเปลี่ยนแปลงด้วยตนเองโดยผู้ใช้
  • ในตารางจัดเก็บพิกัด x & y ขององค์ประกอบข้อความของที่จอดรถแต่ละจุด
  • ไม่ว่าจะใน Inkscape หรือโดยการเขียนสคริปต์แปลงข้อความที่จอดรถจุดทั้งหมดเป็นเส้นทาง
  • สำหรับตัวเลข 0-9 ต่อท้ายไฟล์ SVG <defs>ส่วนที่เหมาะสมจะกำหนดข้อมูลพา ธ สำหรับแต่ละหลัก
  • วนรอบ<g>จุดจอดรถทั้งหมดแล้วแทนที่ด้วยจุด<use xlink:href="#digit" x=x y=y />
  • กำไร

ฉันสามารถล่วงรู้ถึงความยุ่งยากบางอย่างที่คุณจะต้องรับมือและขอให้โชคดีกับสิ่งเหล่านั้น

  • การวนซ้ำจะต้องแยกสายของจุดจอดรถที่มี 2 หลักหรือมากกว่าและระยะห่างที่เหมาะสมระหว่างหลักแรกและหลักถัดไปอาจจะยุ่งยาก สิ่งนี้จะขึ้นอยู่กับแบบอักษรที่คุณใช้เป็นอย่างมาก
  • คุณไม่ได้ระบุตำแหน่งที่จอดรถว่าอยู่ในทิศทางใดหรืออยู่ในแนวตั้งหรือแนวโค้ง เนื่องจากด้วยตนเอง x, y ชดเชยตัวเลข 2 หลักและมากกว่าคุณอาจต้องใช้ตรรกะเพิ่มเติมเพื่อหา 'การวางแนว' ของที่จอดรถและวิธีการเว้นวรรคพา ธ ที่แตกต่างกันของตัวเลขแต่ละตัวให้ถูกต้องจากที่หนึ่ง

หวังว่านี่จะช่วยได้ โชคดี.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.