บันทึกการทำฟอนต์ลายมือ
(kokorobot.ca)- เมื่อข้อความลายมือในคอมิก hakum มีขนาดและความอ่านง่ายไม่สม่ำเสมอในแต่ละหน้า จึงตัดสินใจทำลายมือของตัวเองเป็น ฟอนต์ TTF แทนการใช้ฟอนต์ที่มีอยู่
- ความพยายามครั้งที่สองที่สแกนตัวอักษรที่เขียนบนกระดาษ ดูเป็นธรรมชาติและมีชีวิตชีวามากกว่าลายมือดิจิทัลที่เขียนด้วยแท็บเล็ตปากกา
- ขอบเขตการทำจำกัดไว้ที่ A-Z, a-z, ตัวเลข 0-9 และเครื่องหมายวรรคตอนพื้นฐาน โดยตัดฟีเจอร์เสริมอย่างตัวหนา ตัวเอียง และ ligature ออกจากเป้าหมาย
- กระบวนการคือจัดการภาพสแกนใน Gimp แยกเป็น PNG แล้วปรับเส้นโครงร่าง glyph, ระยะขอบซ้ายขวา และ kerning ใน FontForge
- ในขั้นตอน Autotrace และการส่งออก อาจเกิดปัญหาตรวจสอบอย่าง missing points at extrema และ self intersecting ได้ ฟอนต์ลายมือจึงต้องมีการปรับแต่งหลังทำค่อนข้างมาก
เหตุผลที่เปลี่ยนลายมือเป็นฟอนต์
- ก่อนหน้านี้ ข้อความในคอมิก hakum เขียนแบบดิจิทัลโดยตรงด้วยแท็บเล็ตปากกา
- ผลลัพธ์ออกมาใช้ได้ แต่แม้ในหน้าเดียวกัน ขนาดตัวอักษรมักใหญ่ขึ้นหรือเล็กลงบ่อยครั้ง ทำให้ ความอ่านง่าย ไม่สม่ำเสมอ
- เพราะไม่อยากใช้ฟอนต์ที่มีอยู่ จึงตัดสินใจสร้างฟอนต์จากลายมือของตัวเอง
- เป้าหมายคือ ฟอนต์ TTF สำหรับเผยแพร่บนเว็บ และมีเพียงชุดอักขระที่จำกัด
- ไม่ทำตัวหนาและตัวเอียง
- นี่เป็นครั้งแรกในการทำฟอนต์และใช้ FontForge ดังนั้นอาจมีวิธีที่ดีกว่านี้
ความพยายามสองครั้งและคำศัพท์พื้นฐานของแบบอักษร
- ฟอนต์แรกทำจาก ลายมือดิจิทัล ที่เขียนด้วยแท็บเล็ตปากกา
- ฟอนต์ที่สองทำจากภาพสแกนตัวอักษรที่เขียนบนกระดาษ และตัวอักษรบนกระดาษที่ไม่แม่นยำมากนักก็ดูมีชีวิตชีวาและเป็นธรรมชาติกว่า
- ระหว่างทำฟอนต์ได้เรียนรู้คำศัพท์โครงสร้างของแบบอักษร และการรู้หน้าที่ของแต่ละองค์ประกอบช่วยให้เลือกการออกแบบได้ดีขึ้นและทำฟอนต์ที่ใช้งานได้มากขึ้น
- Ascender: ส่วนของตัวพิมพ์เล็กที่ยื่นขึ้นเหนือ x-height
- Baseline: เส้นฐานที่ตัวอักษรส่วนใหญ่วางอยู่ และเป็นเส้นอ้างอิงที่ descender ยื่นลงไปด้านล่าง
- Cap Height: เส้นที่แสดงความสูงของตัวพิมพ์ใหญ่ส่วนใหญ่
- Descender: ส่วนที่ยื่นลงต่ำกว่า baseline เช่น p, q
- X-Height: ระยะระหว่าง baseline กับ mean line ของตัวพิมพ์เล็ก
ภาพสแกนและการจัดการใน Gimp
- เป้าหมายการทำคือ ตัวพิมพ์ใหญ่ A-Z, ตัวพิมพ์เล็ก a-z, ตัวเลข 0-9 และ เครื่องหมายวรรคตอนพื้นฐาน เช่น จุลภาค เครื่องหมายตกใจ และเครื่องหมายคำถาม
- ตอนแรกใช้ดินสอขีดเส้นอ้างอิง baseline, cap height, x-height และ descender ในสมุดสเก็ตช์ แล้ววาดตัวอักษร
- เมื่อวาดตัวอักษรระหว่างเส้นอ้างอิง ตัวอักษรดูแข็งเกินไป หลังจากนั้นจึงเขียนประโยค
"The quick brown dog jumps over the lazy fox"หลายครั้งทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก- ประโยคนี้มีอักขระทุกตัวที่จำเป็นสำหรับ a-z
- เมื่อเขียนเป็นประโยค จะไม่จดจ่อกับตัวอักษรมากเกินไป ทำให้ได้รูปทรงที่ดีกว่า
- เมื่อวาดบนกริด จะมัวแต่สนใจข้อจำกัด
- เลือกประโยคที่เขียนได้ดีที่สุดมาใช้ทำฟอนต์ และบางส่วนก็ใช้ตัวอักษรที่วาดบนกริดด้วย
- เพราะวิธีนี้ หลังจากนั้นจึงต้องปรับ cap-height, x-height และ descender ของแต่ละตัวอักษรแบบดิจิทัล
- ภาพตัวอักษรที่สแกนถูกนำไปใช้
Color > Thresholdใน Gimp เพื่อลบสีเทาออก - เนื่องจากลักษณะของดินสอและกระดาษ รวมถึงการไม่ใช้กริด จึงใช้เครื่องมือดินสอของ Gimp แก้ข้อบกพร่องของตัวอักษร
- ปิด dynamics ทั้งหมดใน Tool Options เพื่อให้ได้เส้นที่สะอาด
- ตัวอักษรที่จัดการแล้วถูกคัดลอกมารวมในเอกสาร Gimp ใหม่ และตั้งขนาดเอกสารให้รองรับตัวอักษรที่ใหญ่และกว้างที่สุดคือ M ตัวพิมพ์ใหญ่
- ในขั้นตอนนี้ตรวจสอบว่าความหนาของเส้นไม่แตกต่างกันมากเกินไป
- ส่งออกตัวอักษรทั้งหมดเป็น PNG แยกแต่ละตัวไปยังโฟลเดอร์โปรเจกต์
การสร้าง glyph ใน FontForge
- เลือกใช้ FontForge เพราะทำงานบน Linux และคนรอบตัวแนะนำ ประสบการณ์ใช้งานก็ดี
- เมื่อสร้างโปรเจกต์ใหม่ Font View Window จะเปิดขึ้น และแสดงช่อง glyph ทั้งหมดของฟอนต์ในรูปแบบตาราง
- ป้อนข้อมูลฟอนต์ที่
Element > Font Infoและเพิ่มชื่อฟอนต์ใต้ PS Names - หากต้องการส่งออกเป็น TTF ให้เปลี่ยน Em size เป็น 1024 ใน General ของหน้าต่างเดียวกัน
- โดยธรรมเนียม UPM ของฟอนต์ TrueType ใช้เลขยกกำลังของ 2 เช่น 1024 หรือ 2048
- ฟอนต์ OTF มีข้อกำหนดต่างออกไป
- ในอดีตของตัวพิมพ์โลหะ ตัวอักษรแต่ละตัวอยู่ในคอนเทนเนอร์พื้นที่ของตัวเองเพื่อให้มีความสูงคงที่ และความสูงของชิ้นตัวพิมพ์นี้เรียกว่า ‘em’
- เมื่อดับเบิลคลิก glyph ใน Font View จะเปิด Character View
- ที่นี่ใช้วาดหรือแก้ไข glyph
- สามารถดูทีละตัวด้วยอินเทอร์เฟซแบบแท็บ หรือใช้ไฟล์ข้อความที่เตรียมไว้เพื่อตรวจคำแบบเรียงติดกันได้
- เลือกเลเยอร์ Back จากรายการเลเยอร์มุมซ้ายล่าง แล้วนำเข้า PNG ของตัวอักษรนั้นด้วย
File > Import - จากนั้นสร้างเส้นโครงร่าง glyph ด้วยหนึ่งในสองวิธี
- วาดเส้นโครงร่างด้วยตัวเอง
- เลือกเลเยอร์ Fore แล้วสร้างเส้นโครงร่างอัตโนมัติด้วย
Select > Autotrace
- Autotrace อ้างอิงภาพพื้นหลังเพื่อสร้างเส้นโครงร่างที่มี control point และเส้นโค้ง Bezier แต่ก็อาจมีจุดมากเกินไปหรือเกิดปัญหา extrema หายได้
- เมื่อสร้างรูปทรงปิดแล้ว glyph นั้นจะแสดงในหน้าต่างอื่นด้วย
ระยะขอบซ้ายขวาและการพรีวิว
- ปรับ side bearing ซ้ายและขวาของแต่ละ glyph เพื่อกำหนดความกว้างสุดท้ายของ glyph
- หากต้องการจัด glyph ทั้งหมดให้อยู่กึ่งกลางโดยอัตโนมัติ ให้ใช้
Metrics > Auto Width - หากต้องการให้ glyph ทั้งหมดอยู่กึ่งกลางภายในความกว้าง ให้ใช้
Metrics > Center In Width - เวลาจะแก้เส้นโครงร่าง การปิดเลเยอร์อ้างอิงไว้จะช่วยได้
- หากต้องการเริ่ม glyph ใหม่ ให้เลือก glyph ที่ต้องการใน Font Window แล้วใช้
Edit > Clear - หากต้องการลบเฉพาะเลเยอร์อ้างอิง ให้ใช้
Edit > Clear Background - ในช่องข้อความเหนือผืนงานของ Character View ถ้าป้อนคำหรืออักขระใด ๆ ต่อท้ายตัวอักษรปัจจุบัน จะสามารถพรีวิวรูปลักษณ์เมื่ออักขระอยู่ข้างกันได้
- ต้องทำขั้นตอนนี้ซ้ำกับ glyph ทั้งหมด โดยเฉพาะถ้าไม่ปรับ side bearing ซ้ายขวาของ glyph Space ช่องว่างระหว่างคำจะใหญ่เกินไป
การตั้งค่า kerning
- Kerning คือกระบวนการปรับระยะห่างระหว่างอักขระเพื่อให้ตัวอักษรดูอ่านง่าย
- ใน Font Window ไปที่
Element > Font Infoแล้วกด Add Lookup ในแท็บ GPOS ของ Lookups - เลือก
Pair Position (Kerning)จากดรอปดาวน์ Type - ในคอลัมน์ Feature ให้กดลูกศรข้าง
NewเลือกKern Horizontal Kerningแล้วกดยืนยัน - เลือกรายการ GPOS ที่สร้างใหม่ แล้วกด Add Subtable จากนั้นยืนยันโดยคงชื่อเริ่มต้นไว้
- ตัวอักษรที่จะทำ kerning ให้ลากเลือกจากทั้งสองตาราง
- ต้องเลือกทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก
- หากต้องเลือกทั้งสองชุดในตารางเดียว ให้ใช้ Shift
- เมื่อคลิก pairings เวอร์ชันขยายของคู่ glyph จะแสดงที่ด้านล่างของหน้าต่าง
- ลาก glyph ตัวที่สองให้เข้าใกล้หรือห่างจาก glyph ตัวแรกมากขึ้น พร้อมปรับให้ glyph ทุกชุดดูดี
การทดสอบและตรวจสอบการส่งออก
- หากต้องการทดสอบฟอนต์และ kerning ภายใน FontForge ให้ใช้
File > Print - ข้อความเริ่มต้นไม่ได้แสดงทุกชุดที่เป็นไปได้ จึงสามารถเพิ่มข้อความเองได้
- kern_pairings.txt มีชุด kerning ทั้งหมด และสามารถนำไปวางในหน้าจอทดสอบเพื่อใช้ได้
-
ปัญหาที่อาจพบระหว่างการส่งออก
- เมื่อส่งออกด้วย
File > Generate FontsFontForge อาจทำเครื่องหมายอักขระบางตัวเป็นรายการที่ต้องตรวจสอบ - Non-integral coordinates คือกรณีที่ตำแหน่งของจุดหนึ่งจุดหรือหลายจุดในเส้นโครงร่าง glyph มีส่วนทศนิยม เช่น 2.25
- เลือก glyph ที่มีปัญหา แล้วที่
Element > Validation > Find Problemsให้ติ๊ก"non-integral coordinates"จากนั้นทำ fix ซ้ำ - สำหรับฟอนต์ลายมือที่ไม่ได้พึ่งพาความแม่นยำมากนัก การย้ายไปยังพิกัดจำนวนเต็มที่ใกล้มาก ๆ อาจไม่ทำให้เกิดความเปลี่ยนแปลงใหญ่
- Missing points at extrema คือสถานการณ์ที่ control point ของเส้นโค้งดันเส้นโค้งออกนอกขอบเขต
- ต้องปรับ control point เพื่อให้จุดสูงสุดหรือจุดปลายสุดของเส้นโค้งกลายเป็นจุดสีเหลือง
Element > Add Extremaอาจช่วยได้ แต่ก็อาจทำให้ glyph บิดเบี้ยวหรือสร้างปัญหา non-integral coordinates เพิ่มขึ้น- แม้มีข้อผิดพลาดนี้ใน log ก็ยังสร้างฟอนต์ได้ แต่ฟอนต์อาจเกิดการบิดเบี้ยวเล็ก ๆ ที่น่ารำคาญได้
- หากฟอนต์ลายมือมีความรกหรือใช้ Autotrace ก็อาจเกิดปัญหา extrema ได้
- Self intersecting คือสถานการณ์ที่เส้นโครงร่าง glyph ซ้อนทับตัวเอง
- ต้องตรวจเส้นทั้งหมดและกำจัดการซ้อนทับออก
- เมื่อส่งออกด้วย
การเลือก TTF และการติดตั้ง
- สำหรับวัตถุประสงค์การใช้งาน TTF(TrueType Font) ก็เพียงพอแล้ว
- OTF ไม่จำเป็น เพราะไม่มีแผนจะเก็บ glyph จำนวนมาก ไม่ต้องการใส่ตัวหนาและตัวเอียงเป็นสไตล์แยก และไม่ต้องใช้ ligature
- คอนเทนต์ที่จะใช้ฟอนต์นี้จะเผยแพร่บนเว็บ และ TTF เหมาะกับวัตถุประสงค์นี้
- หากต้องการสร้างฟอนต์จาก glyph ทั้งหมดใน Font View ให้ใช้
File > Generate Fonts - เลือก TTF เป็นรูปแบบเอาต์พุตจากดรอปดาวน์ใต้ชื่อฟอนต์แล้วกดยืนยัน ฟอนต์จะถูกบันทึกในโฟลเดอร์โปรเจกต์
- ฟอนต์ที่สร้างแล้วสามารถย้ายไปยังตำแหน่งเก็บฟอนต์ของระบบได้
- เอกสารอ้างอิงและตัวอย่างการใช้งาน
- FontForge documentation: เอกสาร FontForge
- My spellbook: วิธีติดตั้งฟอนต์บน Linux
- kaizah, smile: ตัวอย่างที่ใช้ฟอนต์ที่สร้างขึ้น
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ภาพรวมของ FontForge เขียนได้ดี และเมื่อก่อนผมเองก็เคยลองจับอยู่บ้าง
มันอาจจะดูดิบ ๆ ไปหน่อย แต่ก็ไม่แน่ใจว่าผลิตภัณฑ์เชิงพาณิชย์คู่แข่งจะดีกว่ามากไหม ขนาดชื่อยังแทบไม่รู้จักเลย
แล้วเว็บไซต์ก็เท่มาก มีเอกลักษณ์และบุคลิกชัดเจน
ถ้ามี macOS ก็ลองดู Glyphs(/Mini) หรือ RoboFont ได้ โดยมีช่วงทดลองใช้นานพอสมควร แต่สิ่งที่น่าตั้งตารอที่สุดยังเป็นเครื่องมือรุ่นถัดไป รวมถึงเครื่องมือบนเว็บอย่าง fontra.xyz
งานทั้งหมดเกี่ยวกับ MFEK ที่เคยเห็นมาจนถึงตอนนี้ดูดีมากทีเดียว
https://mfek.org/
ประโยคเดียวอย่าง “quick brown fox” มักไม่พอ
100r.co ก็ควรไปดูให้ได้
Devine และ Rekka ดำเนินสตูดิโอจากเรือใบ Pino พร้อมบันทึกชีวิต การเดินทาง และโปรเจกต์ต่าง ๆ
https://youtu.be/T3u7bGgVspM?si=dnkROEB15z77Pq7Z อยู่แถว ๆ นาทีที่ 6
สรุป FontForge ได้ดี
อย่างที่บทความบอกเป็นนัย ๆ การ สร้างฟอนต์จากลายมือ ยังมีตัวเลือกที่ง่ายกว่าและอัตโนมัติกว่านี้ด้วย จากนั้นค่อยนำฟอนต์ที่ได้กลับมาแก้ไขเพิ่มเติมก็ได้
https://www.calligraphr.com/en/ ชื่อเดิมคือ MyScriptFont
https://apps.microsoft.com/detail/microsoft-font-maker/9N920...
ฟอนต์ที่ทำออกมาดูค่อนข้างคล้ายกับฟอนต์ที่ผมทำไว้
https://imgur.com/a/g8bIoUY
ผมไม่ได้เจาะลึกการปรับแต่งอย่าง kerning มากนัก แต่ซอฟต์แวร์ 3–4 ตัวที่ลองใช้ล้วนชวนหงุดหงิดมาก หรือไม่ก็พัง หรือใช้งานยาก อาจเป็นปัญหาวิธีใช้ของผมเองก็ได้ และซอฟต์แวร์แบบเสียเงินน่าจะดีกว่ามาก นับถือที่ทำจนเสร็จได้
อยากรู้วิธีที่ง่ายที่สุดในการ รวมหลายฟอนต์ให้เป็นฟอนต์เดียว
VS Code ไม่รองรับการตั้งค่าฟอนต์แยกตามภาษาหรือ token เช่น ใช้ Comic Sans กับคอมเมนต์ แล้วใช้ฟอนต์อื่นกับส่วนที่เหลือไม่ได้ แต่ตั้งค่าอย่างตัวเอียง/ตัวหนาได้
ชอบฟอนต์มาตั้งแต่ยุค 80s ตอนที่ Desktop Publishing เริ่มได้รับความนิยมและฟอนต์ถูกใช้อย่างแพร่หลาย
อาจพูดได้ว่าช่วงหนึ่งมันถูกใช้มากเกินไปด้วยซ้ำ แต่ก็เป็นหนึ่งในสิ่งแรก ๆ ที่ทำให้รู้สึกว่าดีไซน์มีความสำคัญ ยังไงก็ตาม ฟอนต์สวยมากและภาพรวมก็ยอดเยี่ยม
สงสัยว่ามีคนทำฟอนต์ด้วย MetaFont/MetaPost จริง ๆ ไหม
ก็ไม่รู้เหมือนกันว่า FontForge มีฟีเจอร์ scripting หรือเปล่า ไม่เคยใช้เอง เคยแค่อ่านดู แต่ผมอ่าน “Computers and Typesetting” ของ Knuth ครบทั้ง 5 เล่มแล้ว
https://thottingal.in/blog/2022/10/05/nupuram/ https://twitter.com/santhoshtr/status/1577596445917470722 https://smc.org.in/fonts/nupuram https://typoday.in/spk_papers/Santhosh_Thottingal_Typoday202...
#!/usr/bin/fontforgeแล้วแค่chmod +xก็รันได้เลยแต่โดยส่วนตัว ผมเคยใช้แค่กับการแก้ไขที่ทำซ้ำได้ เช่น แก้ปัญหาเล็ก ๆ ในฟอนต์เดิมหรือแก้ glyph รายตัว ดังนั้นความพึงพอใจอาจต่างกันไปตามข้อกำหนด
[0]: https://fontforge.org/docs/scripting/python.html
สงสัยว่ามี สตาร์ทอัพ AI wrapper ที่ช่วยทำฟอนต์อยู่แล้วหรือยัง
prompt น่าจะน่าสนใจ เช่น “ออกแบบฟอนต์คริสต์มาสที่ได้รับอิทธิพลจากบอลข่านอย่างแรง แต่ผสม brutalism แบบโซเวียต และเป็นมิตรกับเด็ก” อะไรทำนองนี้
ในเชิงพาณิชย์ การใช้ฟอนต์ที่มีความแปลกใหม่ต่างวัฒนธรรมก็ควรกลายเป็นเรื่องธรรมชาติทางวัฒนธรรมด้วย เข้าใจว่าทำไม Helvetica, Roboto, Noto Sans และฟอนต์สมัยใหม่กว่านั้นถึงถูกใช้ แต่โลกมันก็ดูจืดไปหน่อยจริง ๆ
น่าเสียดายที่บทความบล็อกไม่ได้ใช้ ฟอนต์ของตัวเอง นับเป็นโอกาสที่พลาดไป
ประโยคนั้นควรเป็น สุนัขจิ้งจอกกระโดดข้ามสุนัข ไม่ใช่ “สุนัขกระโดดข้ามสุนัขจิ้งจอก” ;-)
เพราะสุนัขขี้เกียจ ส่วนสุนัขจิ้งจอกว่องไว