ทำไม SVG ถึงไม่มีขนาดจนกว่าคุณจะแปลงมัน
หลายคนถามว่าจะแปลง SVG เป็น PNG "โดยไม่สูญเสียคุณภาพ" ได้อย่างไร และในคำถามนั้นมีความเข้าใจผิดที่ควรเคลียร์ก่อน SVG ไม่มีคุณภาพให้สูญเสีย เพราะมันไม่มีพิกเซลเลยตั้งแต่แรก
เวกเตอร์บรรยาย พิกเซลจัดเก็บ
SVG คือคำบรรยายของรูปทรง — เส้นโค้ง สีเติม ข้อความ — ในระบบพิกัดที่ไม่มีขนาดพิกเซลตายตัว ส่วน PNG คือตารางพิกเซลที่ตายตัว การแปลง SVG เป็น PNG จึงหมายถึงการเลือกขนาดเสมอ และผลลัพธ์จะคมชัดในทุกขนาดที่คุณเลือก
เปิด SVG ด้วยโปรแกรมแก้ไขข้อความ คุณจะเห็นคำสั่ง: ย้ายไปจุดนี้ ลากเส้นโค้งไปจุดนั้น เติมด้วยสีนี้ ไม่มีตรงไหนบอกว่าภาพกว้างกี่พิกเซล เบราว์เซอร์เป็นผู้ตัดสินใจตอนแสดงผล และตัดสินใจต่างกันได้ทุกครั้ง
viewBox, width และ height หมายถึงอะไรจริง ๆ
แอตทริบิวต์สามตัวบนอิลิเมนต์รากเป็นตัวควบคุมขนาด viewBox กำหนดระบบพิกัด — "ภาพนี้กินพื้นที่จาก 0 ถึง 240 ตามแนวนอน และ 0 ถึง 160 ตามแนวตั้ง" ส่วน width และ height ถ้ามี จะเสนอขนาดแสดงผลเริ่มต้น SVG จำนวนมากมีแค่ viewBox บางไฟล์มีแค่ width และ height และบางไฟล์ไม่มีทั้งสองอย่าง
ตัวแปลงนี้อ่านค่าที่มีอยู่ คำนวณขนาดโดยกำเนิดแบบเดียวกับที่เบราว์เซอร์ทำ แล้วใช้เป็นฐาน 1× หากไม่มีการประกาศค่าใดเลย จะใช้ค่าสำรอง 1,024 พิกเซล เพื่อให้คุณยังได้ภาพที่ใช้งานได้
ทำไม "โดยไม่สูญเสียคุณภาพ" จึงเป็นคำถามที่ผิด
เพราะ SVG เรนเดอร์ได้ทุกขนาดจากคำสั่งชุดเดียวกัน PNG ขนาด 4,000 พิกเซลจึงคมชัดเท่ากับขนาด 400 พิกเซลทุกประการ — ตัวเรนเดอร์เพียงวาดรายละเอียดมากขึ้น ทางเดียวที่จะเสียคุณภาพคือเรนเดอร์เล็กแล้วไปขยาย PNG ทีหลัง วิธีแก้คือเลือกขนาดสุดท้ายที่นี่ ตอนแปลง และอย่าขยาย PNG ขึ้นเด็ดขาด
ตัวแปลง SVG เป็น PNG นี้ทำอะไรบ้าง
เครื่องมือนี้อ่านไฟล์ SVG ของคุณในเบราว์เซอร์ ลบทุกอย่างที่รันได้ออก เรนเดอร์แต่ละไฟล์ในขนาดที่คุณเลือกด้วยเอนจินของเบราว์เซอร์เอง แล้วส่ง PNG แบบไม่สูญเสียพร้อมความโปร่งใสครบถ้วนกลับมาให้ — ทีละไฟล์หรือเป็น ZIP
ตัวเรนเดอร์เดียวกับเบราว์เซอร์ของคุณ
ตัวแปลงฝั่งเซิร์ฟเวอร์ใช้ไลบรารีแยกต่างหาก — librsvg, Inkscape, ImageMagick — และแต่ละตัวมีช่องโหว่: ฟิลเตอร์ที่ไม่รองรับ ฟอนต์ที่ถูกแทนที่ ไล่สีที่วาดออกมาต่างไปเล็กน้อย PNG ที่คุณได้กลับมาอาจไม่ตรงกับ SVG ที่คุณดูอยู่
ที่นี่การเรนเดอร์ทำโดย Blink, Gecko หรือ WebKit — แล้วแต่เบราว์เซอร์ที่คุณใช้ — โดยวาด SVG ลงบน canvas ถ้า SVG ดูถูกต้องในเบราว์เซอร์ของคุณ PNG ก็จะเหมือนกันทุกประการ เพราะมันคือภาพวาดเดียวกันจริง ๆ
ลบสคริปต์ออก ไม่มีการอัปโหลด
SVG คือ XML และอาจมีอิลิเมนต์ <script> ตัวจัดการ onload และ HTML ฝังอยู่ ไฟล์จากแหล่งที่ไม่รู้จักไม่ใช่สิ่งที่ควรเปิดแบบไม่ระวัง ก่อนเรนเดอร์ ตัวแปลงจะลบสคริปต์ แอตทริบิวต์อีเวนต์ และบล็อก foreignObject ออก แล้วเรนเดอร์ผลลัพธ์ภายในอิลิเมนต์รูปภาพซึ่งรันโค้ดไม่ได้อยู่แล้ว สองชั้นป้องกัน ทั้งคู่อยู่ในเครื่อง
ไม่มีการอัปโหลดในขั้นตอนใดเลย แผง Network ในเครื่องมือนักพัฒนาของเบราว์เซอร์จะว่างเปล่าตลอดการแปลงทั้งชุด
วิธีแปลง SVG เป็น PNG ใน 3 ขั้นตอน
วางไฟล์ SVG ของคุณ
ลากไฟล์ .svg หนึ่งไฟล์หรือมากกว่ามาวางบนพื้นที่เส้นประ หรือคลิกเพื่อเลือกไฟล์ บนเดสก์ท็อปทำได้ครั้งละสูงสุด 10 ไฟล์ แต่ละแถวแสดงตัวอย่างเวกเตอร์แบบสด — เบราว์เซอร์แสดง SVG ได้โดยตรง สิ่งที่คุณเห็นคือสิ่งที่จะถูกเรนเดอร์
เลือกขนาดและพื้นหลัง
ในการตั้งค่าการแปลง เลือกอัตราขยาย (1×, 2×, 3× หรือ 4× ของขนาด SVG เอง) หรือความกว้าง (ค่าที่ตั้งไว้หรือความกว้างพิกเซลใดก็ได้ ความสูงจะตามอัตราส่วนภาพ) จากนั้นเลือกพื้นหลัง: โปร่งใสเป็นค่าเริ่มต้น หรือขาว ดำ หรือสีใดก็ได้เพื่อแบนภาพลงไป
ดาวน์โหลด PNG หรือ ZIP
กดแปลง แต่ละไฟล์จะแสดงขนาดผลลัพธ์และขนาดไฟล์ PNG ดาวน์โหลดทีละไฟล์ หรือกดดาวน์โหลดทั้งหมดเพื่อรับ ZIP ที่ใช้ชื่อเดิมและนามสกุล .png
วางไฟล์ SVG ได้สูงสุด 10 ไฟล์ อ่านในเครื่องและไม่มีการอัปโหลด
เลือกอัตราขยายหรือพิมพ์ความกว้าง แล้วเลือกพื้นหลังโปร่งใสหรือสีทึบ
ดาวน์โหลด PNG ทีละไฟล์ หรือทั้งหมดเป็น ZIP
เลือกขนาดผลลัพธ์ให้ถูกต้อง
เมื่อขนาดเป็นเรื่องของการเลือก ก็ควรรู้ว่าแต่ละตัวเลือกมีไว้เพื่ออะไร สองโหมดครอบคลุมเกือบทุกกรณี
1×, 2×, 3× — ให้ตรงกับความหนาแน่นหน้าจอ
จอปกติแสดงหนึ่งพิกเซลต่อหนึ่งพอยต์ CSS จอ Retina หรือ HiDPI แสดงสอง โทรศัพท์รุ่นใหม่ส่วนใหญ่แสดงสาม ไอคอนที่มีขนาด 32 พอยต์บนหน้าจอจึงต้องใช้ PNG 32 พิกเซลสำหรับแบบแรก 64 สำหรับแบบที่สอง และ 96 สำหรับแบบที่สาม นั่นคือความหมายทั้งหมดของ 1×, 2× และ 3×
งานเว็บและแอปมักส่งออก SVG เดียวกันในทั้งสามอัตราขยาย วางไฟล์ครั้งเดียว แปลงที่ 1× เปลี่ยนค่า แปลงอีกครั้ง — หรือส่งออกที่ 3× ไปเลยแล้วให้แพลตฟอร์มย่อเอง
ตารางขนาดสำหรับเป้าหมายยอดนิยม
Favicon: 16, 32 และ 48 พิกเซล ทำได้ดีที่สุดด้วยเครื่องมือ PNG เป็น ICO จาก PNG ขนาด 512 พิกเซล ไอคอนแอป: 1024 พิกเซลสำหรับสโตร์ แล้วใช้ตัวสร้างชุดไอคอน อวาตาร์โซเชียล: 400 ถึง 800 พิกเซล ภาพ Open Graph: 1200 × 630 รายการสินค้าบนมาร์เก็ตเพลส: โดยทั่วไป 2000 พิกเซลที่ด้านยาว
ความกว้างกำหนดเองสำหรับงานพิมพ์และมาร์เก็ตเพลส
สำหรับงานพิมพ์ ให้คำนวณย้อนจากขนาดจริงที่ 300 DPI: หน้า A4 กว้าง 2,480 พิกเซล A3 คือ 3,508 สติกเกอร์ 6 นิ้วคือ 1,800 สลับไปโหมดความกว้าง พิมพ์ตัวเลข ความสูงจะตามอัตราส่วนภาพของ SVG ตัวแปลงจำกัดผลลัพธ์ไว้ที่ 16,384 พิกเซลที่ด้านยาว — ขีดจำกัดที่เบราว์เซอร์กำหนดให้ canvas — และจะแจ้งหากต้องลดขนาดตามที่ขอ
ความโปร่งใส พื้นหลัง และขอบ
SVG ส่วนใหญ่ — โลโก้ ไอคอน ภาพประกอบ — ไม่มีพื้นหลัง: รูปทรงลอยอยู่บนความว่างเปล่า PNG เก็บสิ่งนี้ได้ ซึ่งเป็นหนึ่งในสองเหตุผลที่ควรเลือก PNG มากกว่า JPG สำหรับงานนี้
คงพื้นหลังโปร่งใสไว้
ค่าเริ่มต้นที่นี่คือโปร่งใส ทุกพิกเซลที่ SVG ไม่ได้ระบายจะยังคงใส รวมถึงพิกเซลที่ถูกปกคลุมบางส่วนตามขอบโค้งและขอบเฉียง พิกเซลขอบนุ่ม ๆ เหล่านี้คือสิ่งที่ทำให้ PNG วางบนสไลด์สีเข้ม ปุ่มสี หรือภาพถ่ายได้โดยไม่เห็นเส้นขอบ
ผลลัพธ์จะแสดงบนพื้นลายตารางหมากรุก เพื่อให้คุณยืนยันความโปร่งใสก่อนดาวน์โหลด
เมื่อไรควรแบนลงบนสี
ปลายทางบางแห่งจัดการอัลฟาไม่ได้ — โปรแกรมอีเมลรุ่นเก่า เวิร์กโฟลว์งานพิมพ์บางแบบ ตัวอัปโหลดของมาร์เก็ตเพลสบางแห่งที่แปลงเป็น JPG อยู่เบื้องหลัง สำหรับกรณีเหล่านี้ ให้เลือกขาว ดำ หรือสีกำหนดเองในการตั้งค่าพื้นหลัง รูปทรงจะถูกซ้อนลงบนสีนั้น และ PNG จะทึบสนิท
เลือกสีให้ตรงกับที่ที่ภาพจะไปวาง ถ้าแบนลงบนสีขาวแล้วนำ PNG ไปวางบนพื้นหลังเข้ม พิกเซลขอบ — ซึ่งตอนนี้กลายเป็นส้มซีด ฟ้าซีด หรือสีอ่อนของรูปทรงนั้น — จะปรากฏเป็นขอบฟุ้งจาง ๆ ขอบฟุ้งนี้คือข้อร้องเรียนที่พบบ่อยที่สุดเกี่ยวกับโลโก้ที่แปลงมา และมันเป็นเรื่องของการเลือกพื้นหลัง ไม่ใช่ข้อผิดพลาดของการเรนเดอร์
อะไรผิดพลาดได้บ้าง (และแก้อย่างไร)
การเรนเดอร์ในเบราว์เซอร์หมายความว่า PNG ตรงกับหน้าจอ แต่ก็สืบทอดกฎของเบราว์เซอร์ว่ารูปภาพได้รับอนุญาตให้โหลดอะไรบ้างมาด้วย
ฟอนต์หาย
ข้อความใน SVG จะเรนเดอร์ด้วยฟอนต์ที่ไฟล์ระบุไว้ ถ้าฟอนต์นั้นไม่ได้ติดตั้งในเครื่องของคุณและไม่ได้ฝังในไฟล์ เบราว์เซอร์จะใช้ฟอนต์อื่นแทน และ PNG จะแสดงฟอนต์ทดแทนนั้น เว็บฟอนต์ที่อ้างอิงผ่าน URL ก็โหลดไม่ได้เช่นกัน: SVG ที่เรนเดอร์เป็นรูปภาพไม่ได้รับอนุญาตให้ดึงทรัพยากรภายนอก
วิธีแก้ที่เชื่อถือได้คือแปลงข้อความเป็นเส้นโครง (outline) ในโปรแกรมออกแบบก่อนส่งออก SVG ตัวอักษรจะกลายเป็นพาธและเรนเดอร์เหมือนกันทุกที่
รูปภาพที่ลิงก์ไว้หาย
กฎเดียวกันใช้กับ <image href="https://…"> ภาพแรสเตอร์ที่ดึงมาจาก URL จะออกมาว่างเปล่า ให้ฝังภาพแทน — โปรแกรมแก้ไขส่วนใหญ่มีตัวเลือกส่งออกแบบ "ฝังรูปภาพ" ซึ่งเปลี่ยนลิงก์ให้เป็น data URI ภายใน SVG ภาพที่ฝังไว้จะเรนเดอร์ได้ปกติ
ผลลัพธ์ว่างเปล่าหรือเล็กจิ๋ว
SVG ที่ไม่มีทั้ง viewBox และ width กับ height จะถูกเรนเดอร์ที่ขนาดสำรองที่นี่ ถ้าภาพอยู่ห่างจากจุดกำเนิดมาก อาจตกออกนอกพื้นที่ที่มองเห็น ให้เพิ่ม viewBox ที่ครอบคลุมงานทั้งหมด ผลลัพธ์เล็กจิ๋วเกือบทุกครั้งแปลว่า SVG ประกาศ width และ height ไว้เล็ก — สลับไปโหมดความกว้างแล้วพิมพ์ขนาดที่คุณต้องการจริง ๆ
อาการ สาเหตุ วิธีแก้
| อาการ | สาเหตุที่เป็นไปได้ | วิธีแก้ |
|---|---|---|
| ฟอนต์ใน PNG ผิด | ไม่ได้ติดตั้งฟอนต์ / เว็บฟอนต์ถูกบล็อก | แปลงข้อความเป็นเส้นโครงก่อนส่งออก |
| ภาพถ่ายใน SVG ว่างเปล่า | ลิงก์ผ่าน URL ไม่ได้ฝัง | ส่งออกใหม่โดยฝังรูปภาพ |
| PNG เล็กจิ๋ว | SVG ประกาศ width/height ไว้เล็ก | ใช้โหมดความกว้างแล้วพิมพ์ค่าที่ต้องการ |
| งานถูกตัดขาด | viewBox ไม่ครอบคลุมภาพ | แก้ viewBox ในโปรแกรมแก้ไข |
| ขอบฟุ้งบนพื้นหลังเข้ม | แบนลงบนสีขาว | คงความโปร่งใสไว้ หรือแบนลงบนสีพื้นหลังจริง |
| ฟิลเตอร์หรือเบลอดูต่างไป | ตัวแปลงบนเซิร์ฟเวอร์ใช้เอนจินคนละตัว | แปลงที่นี่ — เบราว์เซอร์เป็นผู้เรนเดอร์ |
คนใช้ SVG ในรูปแบบ PNG ทำอะไรบ้าง
ถ้า SVG ขยายได้สมบูรณ์แบบ แล้วทำไมต้องแปลง SVG เป็น PNG ด้วย? เพราะซอฟต์แวร์จำนวนมากยังรับเวกเตอร์ไม่ได้
ชุดไอคอนและ Favicon
แอปสโตร์ ฟอร์แมต favicon และระบบไอคอนหลายระบบต้องการ PNG ขนาดตายตัว แปลงครั้งเดียวที่ขนาดใหญ่สุดที่ต้องใช้ แล้วตัดที่เหลือด้วยตัวสร้างไอคอน หรือ PNG เป็น ICO
แพลตฟอร์มที่ไม่รับ SVG
โซเชียลเน็ตเวิร์ก มาร์เก็ตเพลส ฟอรัมชุมชน และคลังสื่อของ CMS ส่วนใหญ่ปฏิเสธการอัปโหลด SVG — ส่วนหนึ่งเพื่อความปลอดภัย เพราะ SVG อาจมีสคริปต์ PNG ขนาด 2× พื้นหลังโปร่งใสคือตัวแทนสากล
ลายเซ็นอีเมลและจดหมายข่าว
โปรแกรมอีเมลตัด SVG ออกหรือแสดงเป็นภาพเสีย โลโก้ในอีเมลจึงเป็น PNG ทางที่ดีส่งออกที่ 2× แล้วแสดงที่ครึ่งขนาด เพื่อให้คมชัดบนหน้าจอ Retina
งานพิมพ์และงานขนาดใหญ่
โรงพิมพ์รับ PDF และภาพแรสเตอร์ความละเอียดสูง ใช้โหมดความกว้างเรนเดอร์โลโก้ที่ 3,000 หรือ 4,000 พิกเซล แล้วมันจะพิมพ์ออกมาคมชัดในขนาดโปสเตอร์ — เวกเตอร์ที่แรสเตอร์ในขนาดเป้าหมายไม่มีความเบลอจากการขยาย
ตัวแปลง SVG ในเบราว์เซอร์ vs บนเซิร์ฟเวอร์
ตัวแปลง SVG เป็น PNG ออนไลน์แทบทุกตัวอัปโหลดไฟล์แล้วเรนเดอร์บนเซิร์ฟเวอร์ด้วย librsvg, Inkscape หรือเบราว์เซอร์แบบ headless ใช้ได้กับรูปทรงง่าย ๆ แต่เพี้ยนกับทุกอย่างที่ซับซ้อน
ความถูกต้อง
ไลบรารีเรนเดอร์แต่ละตัวรองรับข้อกำหนด SVG ในส่วนที่ต่างกันเล็กน้อย ฟิลเตอร์ มาสก์ โหมดผสมสี CSS ภายในไฟล์ และข้อความบนพาธคือเหยื่อประจำ เอนจินของเบราว์เซอร์คือตัวเรนเดอร์ SVG ที่สมบูรณ์ที่สุดที่มีอยู่ และการเรนเดอร์ด้วยตัวที่อยู่ในเครื่องของคุณหมายความว่า PNG ไม่มีทางต่างจากตัวอย่างที่เห็น
ความเป็นส่วนตัวและข้อจำกัด
โลโก้ที่ยังไม่เปิดตัว แผนภาพผลิตภัณฑ์ กราฟที่มีตัวเลขภายใน: การอัปโหลดสิ่งเหล่านี้ไปยังตัวแปลงคือการรั่วไหลเล็ก ๆ ที่ไม่มีใครตั้งใจ เครื่องมือบนเซิร์ฟเวอร์ยังจำกัดขนาดไฟล์และจำนวนครั้งต่อวัน เพราะการเรนเดอร์มีต้นทุน การเรนเดอร์บนเครื่องของคุณเองตัดทั้งสองอย่างออกไป — ไม่มีอะไรรั่ว และไม่มีอะไรต้องนับ
สิ่งที่เซิร์ฟเวอร์ทำได้ดีกว่า: ฮาร์ดแวร์เก่ามาก ๆ จะเรนเดอร์ชุด SVG ที่ซับซ้อนช้ากว่าศูนย์ข้อมูล แต่สำหรับโลโก้สิบชิ้น ไม่ต่างกันเลย
ทำอะไรกับ PNG ต่อได้บ้าง
ผลลัพธ์จากการแปลง SVG เป็น PNG คือ PNG มาตรฐาน เครื่องมือทุกตัวที่นี่จึงรับมันได้โดยไม่ต้องอัปโหลดอีก
สำหรับเว็บ ส่งผ่านบีบอัด PNG หรือแปลงเป็น WebP — ทั้งคู่คงความโปร่งใสและลดขนาดไฟล์ สำหรับอีเมลหรือภาพถ่าย PNG เป็น JPG จะแบนภาพและย่อขนาด ต้องการขนาดที่แน่นอนภายหลัง ใช้ปรับขนาดรูปภาพ และถ้าคุณเริ่มจากภาพแรสเตอร์แล้วอยากได้เวกเตอร์ PNG เป็น SVG ทำในทิศทางตรงกันข้าม