Kerning ได้ทันที


10

ไม่มีใครรู้อัลกอริทึมใด ๆ ที่จะคำนวณการจัดช่องไฟของตัวอักษรโดยอัตโนมัติตามรูปร่างของรูปสัญลักษณ์เมื่อผู้ใช้พิมพ์ข้อความ?

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

ตัวอย่างของ kerning-on-the-fly:

ภาพหน้าจอ

ในภาพด้านบนaดูเหมือนว่าจะถูกเกินไป มันควรจะเลื่อนจำนวนหนึ่งต่อTเพื่อที่ว่ามันน่าจะเป็นในช่วงกลางของและT gอัลกอริทึมควรตรวจสอบรูปร่างของTและa(และตัวอักษรอื่น ๆ ด้วย) และตัดสินใจว่าaจะต้องเลื่อนไปทางซ้ายเท่าใด นี้จำนวนหนึ่งเป็นสิ่งที่อัลกอริทึมควรคำนวณ - โดยไม่มีการตรวจสอบการจัดช่องไฟคู่เป็นไปได้ของ FONT

ฉันคิดถึงการเขียนโปรแกรมจาวาสคริปต์ (+ svg + html) ที่ใช้ฟอนต์ที่วาดด้วยมือและหลายคนขาดการจัดช่องไฟ ฟิลด์ข้อความจะสามารถแก้ไขได้และสามารถรวมข้อความหลายแบบอักษร ฉันคิดว่า kerning-on-the-fly อาจเป็นวิธีหนึ่งที่ทำให้มั่นใจว่าการส่งข้อความในกรณีนี้หมายถึง

แก้ไข: จุดเริ่มต้นหนึ่งจุดนี้อาจใช้ฟอนต์ svg ดังนั้นจึงง่ายต่อการรับค่าพา ธ ในฟอนต์ svg พา ธ ถูกกำหนดด้วยวิธีนี้:

<glyph glyph-name="T" unicode="T" horiz-adv-x="1251" d="M531 0v1293h
-483v173h1162v-173h-485v-1293h-194z"/>

<glyph glyph-name="a" unicode="a" horiz-adv-x="1139" d="M828 131q-100 -85
-192.5 -120t-198.5 -35q-175 0 -269 85.5t-94 218.5q0 78 35.5 142.5t93
103.5t129.5 59q53 14 160 27q218 26 321 62q1 37 1 47q0 110 -51 155q-69 61
-205 61q-127 0 -187.5 -44.5t-89.5 -157.5l-176 24q24 113 79 182.5t159
107t241 37.5 q136 0 221 -32t125 -80.5t56 -122.5q9 -46 9 -166v-240q0
-251 11.5 -317.5t45.5 -127.5h-188q-28 56 -36 131zM813 533q-98 -40 -294
-68q-111 -16 -157 -36t-71 -58.5t-25 -85.5q0 -72 54.5 -120t159.5 -48q104
0 185 45.5t119 124.5q29 61 29 180v66z"/>

อัลกอริทึม (หรือรหัสจาวาสคริปต์) ควรตรวจสอบเส้นทางเหล่านั้นด้วยวิธีใดวิธีหนึ่งและกำหนดระยะห่างที่เหมาะสมระหว่างพวกเขา


1
หากคุณกำลังมองหาโซลูชันการเข้ารหัสสิ่งนี้จะถูกถามใน SO นั่นคือสิ่งที่คุณกำลังมองหา? ถ้าเป็นเช่นนั้นฉันจะย้ายคำถามที่นั่น
Alan Gilbertson

2
ฉันยอมรับว่านี่เป็นคำถาม SO ฉันถามคำถามเดียวกันใน SO แต่มันปิดเป็นหัวข้อปิดในนั้น จากนั้นจึงถามทาง math.stackexchange แต่มีการปิดแบบเดียวกันเกิดขึ้น สถานที่นี้เป็นสถานที่ที่สามอาจเป็นสถานที่ที่เหมาะสมใครก็ตามที่รู้
Timo Kähkönen

2
ฉันไม่ทราบว่าอัลกอริทึมทำงานอย่างไร แต่ InDesign สามารถทำสิ่งนี้ได้: "Optical kerning ปรับระยะห่างระหว่างอักขระที่อยู่ติดกันตามรูปร่างของพวกเขาแบบอักษรบางตัวมีข้อกำหนด kern-pair ที่แข็งแกร่งอย่างไรก็ตามเมื่อตัวอักษรมีเพียงเล็กน้อยเท่านั้น การจัดช่องไฟหรือไม่มีเลยหรือถ้าคุณใช้รูปแบบตัวอักษรหรือขนาดต่างกันสองคำในหนึ่งคำหรือมากกว่าบนบรรทัดคุณอาจต้องการใช้ตัวเลือกการปรับช่องมองภาพด้วยแสง " help.adobe.com/en_US/indesign/cs/using/…
e100

2
ฉันคิดว่านี่น่าจะอยู่ในขอบเขตเท่าที่อัลกอริทึมทั่วไปดำเนินไป - เป็นลำดับขั้นตอนที่ต้องดำเนินการเพื่อแก้ไขปัญหา แต่ฉันไม่คิดว่าจะมีการใช้งานเฉพาะใน JS หรือภาษาอื่นและกำลังแก้ไขเพื่อพูดถึง JS เป็นกรณีการใช้งานพื้นหลังเท่านั้น
e100

1
ฉันคิดว่าลำดับแรกของธุรกิจคือการกำหนด "ดีที่สุด" ในแบบที่มีประโยชน์สำหรับอัลกอริทึมของเครื่อง
horatio

คำตอบ:


4

ฉันรู้ว่ามันเก่า ฉันกำลังทำงานนี้ในการใช้ WebGL ของข้อความสั่นคลอน (อะไร) วิธีการแก้ปัญหาที่ฉันกำลังดำเนินอยู่จะเป็นดังนี้:

  1. รับรุ่นสัญลักษณ์บิตแมปของคู่สัญลักษณ์ (หรือใช้กับเวกเตอร์หากคุณต้องการ)
  2. สำหรับพิกเซลแต่ละแถว (หรือหน่วยแนวตั้งโดยพลการหากคุณใช้เวกเตอร์) ให้ตรวจสอบว่าร่ายมนตร์ทั้งสองมีพิกเซลอย่างน้อยหนึ่งตัว
  3. สำหรับแต่ละแถวที่ผ่านขั้นตอนที่ 2 ให้คำนวณระยะห่างระหว่างพิกเซลขวาสุดของสัญลักษณ์แรกและพิกเซลซ้ายสุดของสัญลักษณ์ที่สอง
  4. ย้าย glyph ที่สองไปทางซ้ายสุดเท่าที่จะทำได้ในขณะที่ยังคงมีคุณสมบัติตรงตามเกณฑ์เหล่านี้:
    • ช่องว่างในแถวของพิกเซลนั้นมากกว่าช่องว่างต่ำสุดที่คุณระบุ
    • พื้นที่ทั้งหมด (ไม่สนใจแถวที่ไม่มีพิกเซลในหนึ่งในร่ายมนตร์) มากกว่าพื้นที่ขั้นต่ำที่คุณระบุ

ด้วยวิธีนี้ 'พื้นที่' ว่างระหว่างตัวอักษรควรถูกบีบให้มีค่าเฉลี่ยทั่วไป ระบุช่องว่างขั้นต่ำและพื้นที่ขั้นต่ำโดยใช้การทดลองและข้อผิดพลาดและรสนิยมของคุณเองและอาจอนุญาตให้ปรับพารามิเตอร์เหล่านั้นโดยตัวแทนอื่น ๆ เช่น ... เช่นค่าการจัดช่องไฟด้วยตนเอง

เย้ :)

แก้ไข:ฉันเคยทำสิ่งนี้สำเร็จแล้วและมันทำงานได้ดีจริงๆ :)


คำตอบที่ดี! ยินดีต้อนรับสู่ GD.SE :)
Yisela

ขอบคุณสำหรับการต้อนรับ: D !! ฉันควรเพิ่มว่าพื้นที่ควรถูกหารด้วยจำนวนแถวที่กำลังทดสอบจริง ๆ (ซึ่งจริง ๆ แล้วทำให้มันเป็นช่องว่างเฉลี่ยและไม่ใช่พื้นที่จริง ๆ ) และมันก็เป็นการดีที่จะทดสอบว่าช่องว่างของแถวเป็นค่าผิดปกติทางสถิติและไม่สนใจแถวนั้นถ้าเป็น ที่จะช่วยให้หลีกเลี่ยงการบีบตัวอักษรใกล้เกินไปเมื่อมีการเปิดขนาดใหญ่เช่นใน 'G'
jaya

ดูเหมือนว่ามีปัญหาเกี่ยวกับเด็กสองสามคนที่นี่เช่น T- หรือ o 'ตัวอย่างในแบบอักษรบางแบบของแบบอักษรบางแบบ T ให้ไฮเฟ่นเข้าใกล้ T มากเกินไปและ o 'ไม่ได้ใช้พิกเซลร่วมกันในแถวเดียวกันดังนั้นฉันจึงเลือกที่จะใช้แถวที่ใกล้เคียงที่สุดกับพิกเซลหนึ่งพิกเซลในแต่ละครั้งที่เกิดขึ้น ในการทำให้อัลกอริทึมด้านบนมีประสิทธิภาพยิ่งขึ้นคุณต้องตรวจสอบปัญหาประเภทนี้อย่างใด สำหรับวัตถุประสงค์ของฉันมันไม่จำเป็น
jaya

3

นี่เป็นอัลกอริธึมที่ค่อนข้างง่ายที่ฉันได้ลองครั้งหนึ่งและอาจดีพอ

แสดงตัวอักษรที่มีความละเอียดต่ำ - พูดสูงหกหรือเจ็ดพิกเซล (ความสูงของทุนทั่วไป) เกี่ยวกับแนวนอนเดียวกัน คุณต้องการแผนที่แบบไบนารีที่เรียบง่ายซึ่งมีพื้นที่ว่างเทียบกับส่วนต่าง ๆ ของตัวอักษรในตารางความละเอียดต่ำที่เรียบง่าย

"อ้วน" แผนที่จดหมายเหล่านี้ นั่นคือเติมเซลล์ว่างแต่ละเซลล์ที่อยู่ติดกับเซลล์ที่เติม นี่คือการอ้างสิทธิ์อาณาเขตที่ว่างที่อยู่ใกล้กับขอบตัวอักษรมากที่สุดดังนั้นตัวอักษรที่อยู่ใกล้เคียงจึงไม่เข้าใกล้เกินไป

เล่น "Tetris แนวนอน" ด้วยแผนที่ตัวอักษรที่ได้ ให้แรงโน้มถ่วงกระทำไปทางซ้าย ปูดซ้ายมือ "ท้อง" ของ "a" จะ "ตก" เข้าไปในโพรงใต้คานของ "t" "a" เคลื่อนที่ไปกี่เซลล์ ปรับขนาดตามสัดส่วนของขนาดตัวอักษรที่แท้จริงและนั่นเป็นวิธีที่จะให้ค่าความละเอียดสูงที่แท้จริง "a" ไปทางซ้าย


1
ขอบคุณ! เพื่อให้เห็นภาพอัลกอริทึมของคุณคุณสามารถให้ตัวอย่างภาพความละเอียดต่ำโดยใช้คู่ "db", "AA", "Ta" และ "c-" โดยใช้ Arial
Timo Kähkönen

การเริ่มต้นที่ดี แต่ฉันคิดว่านี่อาจมีข้อ จำกัด ที่ตัวละครเอกละครไม่ได้ "Tetris" ด้วยกันเช่น "bd", "TT", "pq", "pq", "gj"
e100

@ E100: ได้อย่างรวดเร็วก่อนผู้ที่จับคู่โดยเฉพาะอย่างยิ่งจะไม่ได้ทับซ้อนกันกล่อง bounding ...
Horatio

แต่โดยทั่วไปแล้วพวกเขาควรจะกระชับกว่า "MM", "NN" ฯลฯ
e100

2

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

แต่อัลกอริธึมเหล่านั้นใช้สำหรับการปรับการจัดช่องไฟให้เข้ากับไฟล์แบบอักษรไม่ใช่ตัวอักษรตามที่สร้างขึ้นจากไฟล์แบบอักษร

คุณคิดว่าจะใช้การปรับช่องไฟอัตโนมัติกับไฟล์ตัวอักษรหรือไม่?

Fontforge (โอเพ่นซอร์ส) และ Fontlab (เชิงพาณิชย์) มีอัลกอริทึมการจัดช่องไฟอัตโนมัติ พวกเขาจะมีช่วงการเรียนรู้ที่ค่อนข้างสูงชัน - คุณต้องคุ้นเคยกับด้านเทคนิคของการทำงานของแบบอักษร

นอกจากนี้ยังมีiKernซึ่งเป็นผู้ชายที่มีความพาณิชย์อักษรช่องไฟบริการโดยเขา Kerns อักษรของคุณสำหรับคุณและไม่ได้งานที่ดีมากกว่า ฉันไม่รู้ราคาเท่าไร


แต่คำถามก็คือ "อัลกอริทึมดังกล่าวทำงานอย่างไร" - คุณสามารถเพิ่มรายละเอียดเกี่ยวกับการทำงานของ FontForge ได้ไหม?
e100

1
ขั้นตอนวิธีการของพวกเขาจะอธิบายไว้ที่นี่
thomasrutter

0

ฉันไม่ได้มีเวลาคิดผ่านหรือวาดภาพประกอบ แต่ฉันมีความคิดครึ่งหนึ่งเกี่ยวกับการตัดแบ่งแต่ละสัญลักษณ์ในแนวตั้งก่อน

จากนั้นสำหรับแต่ละครึ่งให้กำหนดแกนแนวตั้งสองแกน: - เส้นแบ่งครึ่ง - ครึ่งครึ่งระหว่างด้านขวาและด้านขวา - แกน "น้ำหนัก" - ครึ่งหนึ่งของหมึกในแต่ละด้าน

จากนั้นย้ายสัญลักษณ์ใกล้เคียงที่อยู่ติดกันไปทางหรือออกจากการทดสอบครึ่งสัญลักษณ์ตามตำแหน่งสัมพัทธ์ของสองแกน

ตัวอย่างเช่นในคู่ "AV" ครึ่งขวาของ A นั้นหนักไปทางซ้ายและ "ดึงดูด" V; ครึ่งซ้ายของ V นั้นหนักหน่วง "ดึงดูด" A ดังนั้นพวกมันจึงถูกรวมเข้าด้วยกันอย่างมีความหมาย

อย่างไรก็ตามฉันแน่ใจว่ามีข้อบกพร่องใน "AA" ที่จะถูกรวมเข้าด้วยกันมากเท่ากับ "AV"


0

พิจารณาตัวพิมพ์ใหญ่และตัวพิมพ์เล็กมี56X55=2652สถานการณ์ตัวอักษรคู่ที่คุณควรกังวลการแก้ปัญหาทั้งหมดอาจแตกง่ายหากคุณเปลี่ยนรูปแบบตัวอักษรกฎทั้งหมดหายไป

วิธีที่ดีที่สุดคือใช้เทคนิคการเรียนรู้ของเครื่องลองสร้างรูปแบบการเรียนรู้โครงข่ายประสาทเทียมและนำเข้ารูปภาพหรือเวกเตอร์หรือ kerned หลาย ๆ แบบเช่นนั้นฝึกรูปแบบนั้นและใช้แบบจำลองที่ผ่านการฝึกอบรมแล้ว

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


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