SVG shape-rendering crispEdges: ช่วยเมื่อไร?
ดูว่า crispEdges ของ SVG ช่วยภาพที่อิงกริดพิกเซลเมื่อไร ทำให้เส้นโค้งหยาบขึ้นได้อย่างไร และทำไมควรทดสอบสองขนาดในเบราว์เซอร์แทนการมองคำแนะนำเรนเดอร์เป็นวิธีซ่อม
ในหน้านี้
ใช้ shape-rendering="crispEdges" เมื่อ SVG ตั้งใจให้ขอบแข็งและส่วนใหญ่เป็นเส้นตรง และทดสอบที่ขนาดแสดงผลสุดท้ายแล้วดูดีขึ้น หากความต่างเล็กน้อยให้คงค่าเริ่มต้น auto สำหรับภาพที่มีเส้นโค้ง คำแนะนำนี้อาจทำให้ขอบหยาบขึ้น มันเปลี่ยนวิธีที่ตัวเรนเดอร์ วาด รูปทรงที่มีอยู่ ไม่ได้เปลี่ยนตัวรูปทรง ข้อกำหนด SVG 2 เรียกมันว่าคำแนะนำ และอนุญาตให้ตัวเรนเดอร์ลดการลบรอยหยักหรือจัดขอบบางส่วนให้ตรงพิกเซลอุปกรณ์
ความต่างนี้สำคัญเมื่อไอคอนเล็กดูฟุ้งหรือโลโก้ดูเป็นหยักหลังส่งออก crispEdges ไม่สามารถเปลี่ยน PNG ที่ฝังอยู่เป็นพาธ ซ่อมเส้นรอบรูปที่เสีย หรือรับประกันพิกเซลเหมือนกันทุกเบราว์เซอร์ ก่อนเปลี่ยนทั้งไฟล์ ให้เปรียบเทียบรูปทรงตัวแทนหนึ่งรูปด้วย auto, crispEdges และ geometricPrecision ที่ขนาดซึ่งผู้ใช้จะเห็นจริง
เลือกตามขอบที่ต้องการ
- ภาพสี่เหลี่ยมที่อิงกริดพิกเซล: ทดสอบ
crispEdgesบนรูปทรงที่เกี่ยวข้อง แล้วตรวจทั้งขนาดเล็กและใหญ่ - เส้นโค้งหรือตัวอักษรมน: เริ่มด้วย
auto; ลองgeometricPrecisionหากตัวเรนเดอร์ทำให้เห็นความต่าง - ช่องว่างระหว่างรูปทรงข้างกัน: ตรวจเรขาคณิตก่อน คำแนะนำเรนเดอร์ปิดช่องจริงไม่ได้
- PNG ที่ปรับสเกลอยู่ใน SVG: ใช้ตัวควบคุมสเกลราสเตอร์ หรือสร้างภาพเป็นพาธใหม่หากเป้าหมายคือแก้ไขได้
crispEdges ขอให้ตัวเรนเดอร์ทำอะไร
SVG มีค่า shape-rendering สี่แบบ เป็นการจัดลำดับความสำคัญ ไม่ใช่รูปแบบส่งออกสี่ชนิด ค่าเริ่มต้น auto ให้ตัวเรนเดอร์สมดุลความเร็ว ความเปรียบต่างของขอบ และความแม่นยำเรขาคณิต crispEdges เน้นความเปรียบต่างของขอบและอาจลดการลบรอยหยัก ส่วน geometricPrecision เน้นเรขาคณิตที่ตรงต้นฉบับ เอกสารอ้างอิงแอตทริบิวต์ SVG ของ MDN อธิบายว่าตัวเรนเดอร์ อาจ จัดการขอบทั้งหมดต่างไป หรือเฉพาะขอบเกือบแนวนอนและแนวตั้ง ไม่มีการกำหนดว่าต้องใช้ฟิลเตอร์เพิ่มความคม
| ค่า | สิ่งที่ขอ | การทดสอบแรกที่มีประโยชน์ |
|---|---|---|
auto | ให้ตัวเรนเดอร์เลือกข้อแลกเปลี่ยน | ค่าฐานสำหรับ SVG ทุกไฟล์ |
crispEdges | เพิ่มความเปรียบต่างที่ขอบรูปทรง | สัญลักษณ์สี่เหลี่ยมหรือรายละเอียดแบบกริด |
geometricPrecision | วางเรขาคณิตตรงต้นฉบับยิ่งขึ้น | เส้นโค้ง เส้นทแยง และเส้นรอบรูปละเอียด |
optimizeSpeed | ให้ความสำคัญกับความเร็วเรนเดอร์ | บริบทเฉพาะ; อย่าคิดว่าจะทำให้ภาพดีขึ้น |
แอตทริบิวต์บนองค์ประกอบ SVG แม่ถ่ายทอดให้รูปทรงลูกได้ การใช้ที่รากจึงอาจกระทบวงกลมที่ควรเรียบ คุณกำหนดเฉพาะสี่เหลี่ยมหรือพาธเดียวได้ หากทั้งแอตทริบิวต์นำเสนอ SVG และการประกาศ CSS shape-rendering ใช้กับวัตถุเดียวกัน พร็อพเพอร์ตี CSS จะมีลำดับความสำคัญสูงกว่า
เราเปรียบเทียบรูปทรงเดียวกันที่สองขนาด
เราสร้างสัญลักษณ์กริดสี่เหลี่ยมและเส้นรอบรูปโค้งเป็นรูปทรง SVG ต้นฉบับ มาร์กอัป สีเติม และ viewBox เหมือนกันทั้งสามคอลัมน์ ต่างเฉพาะค่า shape-rendering แต่ละรูปเรนเดอร์ที่ 63 และ 111 พิกเซล CSS ใน Chromium โดยซูมเบราว์เซอร์ 100% ภาพนี้จับจากการทดสอบในเครื่องจริง ไม่ใช่ภาพประกอบผลที่จินตนาการขึ้น

ไม่มีโหมดใดเปลี่ยนพาธ ในภาพจับนี้ความต่างน้อยเกินไปจะประกาศว่าค่าใดชนะโดยทั่วไป ชื่ออาจฟังเหมือนเครื่องมือซ่อม แต่ผลกับรูปทรง ขนาด และตัวเรนเดอร์เฉพาะอาจเล็กน้อย ตรวจปลายทางจริงก่อนเก็บแอตทริบิวต์เพิ่มเติมนี้ไว้
นี่เป็นการเรนเดอร์ Chromium ครั้งหนึ่ง ไม่ใช่การศึกษาความเข้ากันได้ของเบราว์เซอร์ โปรแกรมดู PDF โปรแกรมออกแบบ หรือเบราว์เซอร์ที่สเกลอุปกรณ์ต่างกันอาจแปลงพาธเดียวกันเป็นพิกเซลต่างไป นิยาม SVG 2 จงใจเปิดทางเลือกการนำไปใช้ไว้
ทดสอบกับรูปเดียวก่อนใช้ทุกส่วน
บันทึกสำเนา SVG แล้วใส่คำแนะนำบนรูปทรงตัวแทน เช่น ใช้กับส่วนสี่เหลี่ยมของไอคอน โดยให้รายละเอียดโค้งใช้ auto ต่อไป:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<rect x="4" y="4" width="16" height="8" fill="#154b67"
shape-rendering="crispEdges" />
<path d="M5 18 Q12 11 19 18" fill="none" stroke="#23a6a1"
stroke-width="2" shape-rendering="auto" />
</svg>เปิดไฟล์ในโปรแกรมดูปลายทางทั้งที่ขนาดไอคอนเล็กและขนาดใหญ่ เทียบกับต้นฉบับที่เก็บไว้ รวมถึงเส้นทแยงและเส้นโค้ง หากจัดสไตล์ SVG inline ด้วย CSS ให้ตรวจว่ามีกฎที่แทนค่าแอตทริบิวต์หรือไม่ ลบคำแนะนำเมื่อไม่ได้ช่วยอย่างมีนัยสำคัญ พร็อพเพอร์ตีที่ไม่จำเป็นทำให้วินิจฉัยความต่างในการแสดงผลภายหลังยากขึ้น
เลือกวิธีแก้ให้ตรงอาการจริง
| อาการ | สิ่งที่ตรวจแรก | ขั้นตอนถัดไปที่เหมาะกว่า |
|---|---|---|
| สัญลักษณ์สี่เหลี่ยมดูนุ่มที่ขนาดหนึ่ง | เทียบ auto และ crispEdges ที่ขนาดนั้น | เก็บคำแนะนำเฉพาะเมื่อช่วยผลลัพธ์ที่ต้องการ |
| วงกลมหรือเส้นทแยงดูหยัก | ตรวจว่ารูปนั้นรับทอดหรือถูกส่งออกด้วย crispEdges หรือไม่ | ลบหรือเทียบ auto กับ geometricPrecision |
| มีเส้นบางระหว่างสีเติมที่แตะกัน | เทียบซูม พื้นหลัง และขอบพาธ | ใช้คู่มือวินิจฉัยรอยต่อ SVG; ซ่อมเรขาคณิตเฉพาะเมื่อช่องว่างเป็นของจริง |
| ขยายแล้วไฟล์ยังเห็นพิกเซลสี่เหลี่ยม | ตรวจภาพราสเตอร์ที่ฝังอยู่ | ใช้รายการตรวจ SVG แตกเป็นพิกเซล แทนการเปลี่ยน shape-rendering |
สำหรับสไปรต์ PNG ที่กริดพิกเซลแม่นยำเป็นตัวงานออกแบบ การเก็บราสเตอร์อาจชัดเจนที่สุด CSS image-rendering: pixelated ควบคุมวิธีสุ่มตัวอย่างภาพที่ปรับสเกล เป็นคนละพร็อพเพอร์ตีกับ SVG shape-rendering คู่มือแปลงพิกเซลอาร์ต อธิบายว่าเมื่อไรควรรักษากริด สร้างบล็อกเวกเตอร์บนกริด หรือจงใจทำเส้นรอบรูปให้เรียบ
เมื่อใด PerfectVector จึงเหมาะ
หากต้นทางมีเพียง PNG เล็กที่รวมเป็นภาพแบนและต้องการ พาธที่แก้ไขได้ คำแนะนำเรนเดอร์ให้พาธไม่ได้ PerfectVector มีประโยชน์ในขั้นตอนก่อนหน้านั้น: แปลง PNG เป็น SVG สำหรับประเมิน แล้วตรวจรูปทรงที่ขนาดต้องการ ตรวจเส้นรอบนอก ช่องภายใน และรายละเอียดเล็กก่อนลองคำแนะนำแสดงผลกับพาธที่เลือก การไล่เส้นตีความพิกเซลใหม่เป็นเรขาคณิตได้ แต่ตัดสินใจแทนไม่ได้ว่าขั้นบันไดของพิกเซลอาร์ตควรเป็นเส้นโค้งเรียบหรือไม่
เก็บ PNG เมื่อกริดต้นฉบับเป็นงานภาพสุดท้าย หากมี SVG สะอาดอยู่แล้วและดูผิดเฉพาะในเบราว์เซอร์ ให้แก้การแสดงผลหรือเรขาคณิตโดยตรง เมื่อ PNG แบบแบนจำเป็นต้องมีเส้นรอบรูปที่แก้ได้จริง สร้าง SVG สำหรับประเมินด้วย PerfectVector ตรวจพาธ แล้วเปรียบเทียบภาพเรนเดอร์ในเบราว์เซอร์ที่ขนาดสุดท้ายก่อนเพิ่ม crispEdges
คำถามที่พบบ่อย
crispEdges ปิดการลบรอยหยักสำหรับทุกรูปทรง SVG หรือไม่?
ไม่ มันขอให้ตัวเรนเดอร์เน้นความเปรียบต่างขอบ ข้อกำหนดอนุญาตการนำไปใช้ต่างกัน รวมถึงแบบที่เปลี่ยนเฉพาะขอบเกือบแนวตั้งหรือแนวนอนบางส่วน ทดสอบผลในโปรแกรมดูที่จะใช้
ควรใส่ shape-rendering="crispEdges" ให้ทั้ง SVG หรือไม่?
เฉพาะเมื่อรูปทรงลูกทุกตัวได้ประโยชน์ คำแนะนำระดับรากกระทบลูกที่เป็นเส้นโค้งได้ด้วย การใช้แอตทริบิวต์กับรูปสี่เหลี่ยมเดียวประเมินง่ายกว่าและมีโอกาสทำเส้นโค้งหยาบน้อยกว่า
crispEdges แก้รอยต่อขาวหรือ PNG เบลอใน SVG ได้หรือไม่?
มันปิดช่องจริงหรือแทนพิกเซลราสเตอร์ด้วยพาธเวกเตอร์ไม่ได้ วินิจฉัยเรขาคณิตรอยต่อก่อน สำหรับ PNG ที่ปรับสเกล ใช้วิธีปรับสเกลราสเตอร์ที่เหมาะ หรือสร้างพาธเวกเตอร์ที่แก้ได้หากนั่นคือความต้องการจริง
แหล่งอ้างอิง
- W3C — พร็อพเพอร์ตี shape-rendering ใน SVG 2 — นิยามสี่ค่าเป็นคำแนะนำตัวเรนเดอร์และอธิบายข้อแลกเปลี่ยนที่อนุญาต
- MDN — แอตทริบิวต์ shape-rendering ของ SVG — อธิบายรูปทรง SVG ที่ใช้ได้ การรับทอด และลำดับความสำคัญ CSS
- MDN — พร็อพเพอร์ตี shape-rendering ของ CSS — อธิบายพฤติกรรมพร็อพเพอร์ตีและเหตุที่การเรนเดอร์เส้นโค้งต่างกันได้
- MDN — พร็อพเพอร์ตี image-rendering ของ CSS — แยกการปรับสเกลพิกเซลราสเตอร์ออกจากการเรนเดอร์ขอบรูปทรงเวกเตอร์
เพิ่มเติมจากบล็อก

Convert to Vector ใน Scratch: ทำไมยังเห็นเป็นพิกเซล
ปุ่ม Convert to Vector ของ Scratch เปลี่ยนโหมดแก้ไขโดยไม่ลากเส้นบิตแมป ตรวจจุดบนคอสตูม เลือกวิธีแก้ และตรวจ SVG ที่นำเข้าก่อนใช้

SVG z-index ไม่ทำงาน? แก้ลำดับซ้อนพาธ
เมื่อ z-index ของ SVG ไม่ดึงพาธมาด้านหน้า ให้ตรวจลำดับองค์ประกอบ เปรียบเทียบตราเดียวกันก่อนและหลังจัดลำดับใหม่ แล้วตรวจกลุ่มและไฟล์ส่งออก