Kerning trên bay


10

Có ai biết bất kỳ thuật toán nào sẽ tự động tính toán các ký tự dựa trên hình dạng glyph khi người dùng nhập văn bản không?

Tôi không có nghĩa là tính toán tầm thường về chiều rộng trước hoặc tương tự, ý tôi là phân tích hình dạng của glyphs để ước tính khoảng cách tối ưu trực quan giữa các ký tự. Ví dụ: nếu chúng ta sắp xếp ba ký tự liên tiếp trong một dòng, thì ký tự giữa sẽ SEEM ở giữa dòng bất chấp hình dạng của ký tự. Một ví dụ khai sáng chức năng k sâu-trên-bay:

Một ví dụ về kTHER-on-the-fly:

Ảnh chụp màn hình

Trong hình ảnh trên adường như là quá đúng. Nó nên được chuyển một số tiền nhất định về phía trước Tđể nó dường như ở giữa Tg. Thuật toán sẽ kiểm tra các hình dạng của Ta(và có thể cả các chữ cái khác nữa) và quyết định mức độ aphải dịch chuyển sang bên trái. Đây số tiền nhất định là điều mà các thuật toán cần tính toán - KHÔNG XÉT cặp chữ CÓ THỂ CỦA FONT.

Tôi đang nghĩ đến việc mã hóa chương trình javascript (+ svg + html) sử dụng phông chữ vẽ tay và nhiều trong số chúng thiếu các cặp k sâu. Các trường văn bản sẽ có thể chỉnh sửa và có thể bao gồm văn bản của nhiều phông chữ. Tôi nghĩ rằng kTHER-on-the-fly có thể là một cách để đảm bảo dòng văn bản trung bình trong trường hợp này.

EDIT: Một điểm bắt đầu cho điều này có thể là sử dụng phông chữ svg, vì vậy thật dễ dàng để có được các giá trị đường dẫn. Trong phông chữ svg, đường dẫn được định nghĩa theo cách này:

<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"/>

Thuật toán (hoặc mã javascript) nên kiểm tra các đường dẫn đó theo một cách nào đó và xác định khoảng cách tối ưu giữa chúng.


1
Nếu bạn đang tìm kiếm một giải pháp mã hóa, điều này sẽ được hỏi tốt hơn về SO. Có phải đó là những gì bạn đang tìm kiếm? Nếu vậy, tôi sẽ chuyển câu hỏi ở đó.
Alan Gilbertson

2
Tôi đồng ý rằng đây là câu hỏi SO. Tôi đã hỏi cùng một câu hỏi trong SO, nhưng nó đã bị đóng như là chủ đề ngoài kia. Sau đó hỏi trên math.stackexchange, nhưng việc đóng cửa tương tự đã xảy ra. Đây là nơi thứ ba, có thể đây là nơi thích hợp, bất cứ ai biết.
Timo Kähkönen

2
Tôi không biết thuật toán hoạt động như thế nào, nhưng InDesign có thể làm được điều này: "K sâu quang điều chỉnh khoảng cách giữa các ký tự liền kề dựa trên hình dạng của chúng. Một số phông chữ bao gồm các thông số kỹ thuật của cặp kern mạnh mẽ. Tuy nhiên, khi một phông chữ chỉ tích hợp tối thiểu k sâu hoặc không có gì cả, hoặc nếu bạn sử dụng hai kiểu chữ hoặc kích cỡ khác nhau trong một hoặc nhiều từ trên một dòng, bạn có thể muốn sử dụng tùy chọn k sâu quang. " help.adobe.com/en_US/indesign/cs/using/...
E100

2
Tôi nghĩ rằng điều này có thể nằm trong phạm vi xa như một thuật toán chung - một chuỗi các bước sẽ được thực hiện để giải quyết vấn đề. Nhưng tôi không nghĩ các chi tiết cụ thể về triển khai trong JS hoặc ngôn ngữ khác thuộc về và đang chỉnh sửa để chỉ đề cập đến JS làm trường hợp sử dụng nền.
e100

1
Tôi nghĩ rằng thứ tự đầu tiên của kinh doanh là định nghĩa "tối ưu" theo cách có ích cho thuật toán máy.
horatio

Câu trả lời:


4

Tôi biết điều này là cũ. Tôi đang làm việc này ngay bây giờ trong một triển khai WebGL của văn bản chao đảo (bất cứ điều gì). Giải pháp tôi đang thực hiện như sau:

  1. Nhận phiên bản bitmap của cặp glyph (hoặc thực hiện với vectơ nếu bạn muốn)
  2. Đối với mỗi hàng pixel (hoặc đơn vị dọc tùy ý nếu bạn đi với vectơ), hãy kiểm tra xem cả hai glyph có ít nhất một pixel không
  3. Đối với mỗi hàng vượt qua bước 2, hãy tính khoảng cách giữa pixel ngoài cùng bên phải của glyph đầu tiên và pixel ngoài cùng bên trái của glyph thứ hai
  4. Di chuyển glyph thứ hai càng xa càng tốt trong khi vẫn đáp ứng các tiêu chí sau:
    • khoảng cách trong hàng pixel đó lớn hơn một số khoảng cách tối thiểu bạn đã chỉ định
    • tổng diện tích (bỏ qua các hàng không có pixel trong một trong các glyph) lớn hơn một số khu vực tối thiểu bạn đã chỉ định

Theo cách đó, 'vùng' trống giữa các chữ cái sẽ bị nén đến mức trung bình khá phổ biến. Chỉ định khoảng cách tối thiểu và diện tích tối thiểu bằng cách sử dụng thử và sai và sở thích của riêng bạn, và có thể cho phép các tham số đó được điều chỉnh bởi một số tác nhân khác cũng như ... như một giá trị k sâu thủ công.

vâng :)

Chỉnh sửa: Tôi đã thực hiện điều này thành công bây giờ và nó hoạt động thực sự tốt :)


Câu trả lời tốt đẹp! Chào mừng bạn đến với GD.SE :)
Yisela

Cảm ơn đã chào đón: D !! Tôi nên thêm rằng khu vực nên được chia cho số lượng hàng thực sự đang được thử nghiệm (điều này thực sự chỉ làm cho nó một khoảng cách trung bình và không thực sự là một khu vực). Và cũng tốt để kiểm tra xem khoảng cách của một hàng là một ngoại lệ thống kê và bỏ qua hàng đó nếu có. Điều đó sẽ giúp tránh việc ép các chữ cái quá gần khi có một lỗ mở lớn như trong 'G'
jaya

Dường như có một vài vấn đề trẻ em ở đây và ở đó, như T- hoặc o 'chẳng hạn trong một số kiểu phông chữ của một số phông chữ. T- để dấu gạch nối quá gần với chữ T và o 'không chia sẻ bất kỳ pixel nào trong cùng một hàng, vì vậy tôi đã tạo một dự phòng để sử dụng các hàng gần nhất với mỗi pixel mỗi lần xảy ra. Để làm cho thuật toán trên mạnh mẽ hơn, bạn cần kiểm tra các loại vấn đề này bằng cách nào đó. Đối với mục đích của tôi, nó không cần thiết.
jaya

3

Đây là một thuật toán khá đơn giản tôi đã thử một lần và có thể đủ tốt.

Kết xuất các ký tự ở độ phân giải thấp - giả sử chiều cao sáu hoặc bảy pixel (chiều cao của thủ đô điển hình) về cùng một chiều ngang. Bạn muốn có một bản đồ nhị phân đơn giản về nơi có không gian trống so với các phần của chữ cái, trên lưới độ phân giải thấp đơn giản.

"Vỗ" các bản đồ thư này. Đó là, điền vào mỗi ô trống liền kề với một ô được điền. Điều này là để yêu cầu lãnh thổ trống gần các cạnh chữ cái nhất, vì vậy chữ cái lân cận không quá gần.

Chơi "Tetris ngang" với các bản đồ chữ cái kết quả. Hãy để trọng lực tác động sang trái. Phần "bụng" bên trái của "a" sẽ "rơi" vào khoang dưới thanh ngang của chữ "T". Có bao nhiêu tế bào đã di chuyển "a"? Chia tỷ lệ theo tỷ lệ với kích thước thực tế của các chữ cái và đó là bao xa để tạo ra độ phân giải cao "a" thực tế.


1
Cảm ơn! Để trực quan hóa thuật toán của bạn, bạn có thể cung cấp một số ví dụ hình ảnh độ phân giải thấp bằng cách sử dụng các cặp "db", "AA", "Ta" và "c-" bằng Arial.
Timo Kähkönen

Khởi đầu tốt, nhưng tôi nghĩ rằng điều này có thể bị hạn chế khi các cặp nhân vật nhô ra không "Tetris" cùng nhau, ví dụ "bd", "TT", "pq", "gj"
e100

@ e100: Thoạt nhìn những cặp đôi cụ thể đó sẽ không có các hộp giới hạn chồng chéo ...
horatio

Nhưng nói chung, họ nên được chặt chẽ hơn "MM", "NN", v.v.
e100

2

Các thuật toán cho tự động k sâu đã tồn tại. Không có gì là bằng chứng ngu ngốc và họ có xu hướng cần một chút cầm tay và chỉnh sửa thủ công các khía cạnh nhất định, đặc biệt nếu theo dõi của bạn tương đối chặt chẽ.

Nhưng những thuật toán này là để áp dụng k sâu cho tệp phông chữ , không phải cho các chữ cái khi chúng được tạo từ tệp phông chữ.

Bạn đã xem xét áp dụng tự động k sâu vào tập tin phông chữ?

Fontforge (mã nguồn mở) và Fontlab (thương mại) chứa các thuật toán tự động. Họ sẽ có một đường cong học tập tương đối dốc - bạn phải làm quen với các khía cạnh kỹ thuật về cách các phông chữ hoạt động.

Ngoài ra còn có iKern mà là một anh chàng đó cung cấp một font-kerning thương mại dịch vụ theo đó ông Kerns phông chữ của bạn cho bạn và làm một công việc khá tuyệt vời. Tôi không biết nó sẽ có giá bao nhiêu.


Nhưng câu hỏi thực sự là "một thuật toán như vậy sẽ hoạt động như thế nào?" - bạn có thể thêm bất kỳ chi tiết nào về cách hoạt động của FontForge không?
e100


0

Tôi không có thời gian để suy nghĩ điều này thông qua, hoặc vẽ minh họa, nhưng tôi đã có một nửa ý tưởng dựa trên việc chia đôi từng glyph theo chiều dọc.

Sau đó, cho mỗi nửa, xác định hai trục dọc: - thước chia - chính xác một nửa giữa cực trị trái và phải - trục "trọng lượng" - chính xác một nửa mực ở mỗi bên

Sau đó di chuyển glyph lân cận lân cận về phía hoặc ra khỏi nửa glyph thử nghiệm dựa trên vị trí tương đối của hai trục.

Vì vậy, ví dụ, trong cặp "AV", nửa bên phải của chữ A nặng và "thu hút" chữ V; nửa bên trái của chữ V nặng "thu hút" chữ A, do đó chúng được gắn kết với nhau một cách đáng kể.

Tuy nhiên, tôi chắc chắn rằng có một lỗ hổng trong "AA" sẽ được gắn kết với nhau giống như "AV".


0

Xem xét chữ hoa và chữ thường, có những 56X55=2652tình huống cặp phông chữ bạn nên quan tâm, tất cả các giải pháp có thể dễ dàng bị phá vỡ nếu bạn thay đổi kiểu phông chữ, tất cả các quy tắc đều biến mất.

Cách tốt nhất là sử dụng kỹ thuật học máy, cố gắng thiết lập mô hình nghiên cứu mạng thần kinh và nhập nhiều hình ảnh văn bản hoặc vectơ hoặc những thứ tương tự, đào tạo mô hình đó và sử dụng mô hình được đào tạo đó để điều chỉnh thông minh bất kỳ loại phông chữ nào.

Vì không có thuật toán tĩnh để điều chỉnh phông chữ hoàn hảo trong root, máy học sẽ là một giải pháp tốt cho loại vấn đề này!


Không nếu chỉ có chủ yếu là tiêu chí chủ quan. "Đây là chó hay mèo?", Cho dù chú chó trông kỳ lạ thế nào, vẫn có câu trả lời chính xác. (Ngay cả khi cần bác sĩ thú y để xác minh.)
usr2564301
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.