Font Rending 的 Hint 機制對排版的影響

                    

Font Rending 的 Hint 機制對排版的影響【轉】

在設計一種 Font 時,設計者使用的是一個抽象的單位,叫做 EM,來源于大寫 M 的寬度(通常英文字體中大寫 M 的寬度最大)。EM 即不同于在屏幕顯示時用的像素(Pixel)也不同于打印時用的點(Point; 1/72 inch),他是一種相對單位,隨著字體和字號的不同變化。通常對于一個 12 號的字體一個 EM 的長度等于 12pt。

實際設計時會將 EM 分成更小的單位,一般成為 EM Unit,TrueType 中一般是 2048 Units = 1 EM,Type1 中一般是 1000 Unit = 1EM。假設在我們設計的字體中字母 a 的寬度為 998 Units,如果我們用 12 號字顯示它,我們得到的字寬為 12 * 998 / 2048 = 5.84765625 Point。如果我們將這個字打印到紙上,在 2000 dpi 的打印機上我們需要放置 5.84765625 / 72 * 2000 = 162.434895833 個 Dot(可以將 Dot 理解成墨滴)。而實際上我們不可能得到 0.43 個 Dot,我們只能用 162 個點來描述字母 a。如果我們將同樣的一個字母顯示在屏幕上,一般來說屏幕多為 72dpi 或 96dpi,以 96dpi 為例也字母 a 需要 5.84765625 / 72 * 96 = 7.796875 個像素來顯示,實際上我們得到的是 8 個。在排版時我們需要根據一個字符的寬度來計算下一個字符的位置,這里的問題是:由于輸出設備的限制我們永遠也不可能將字母放在理論中的位置,設備的分辨率越低結果偏差的越大。反鋸齒能夠在一定程度上緩解這個問題,但不總是能的到好的結果。

另外在字體渲染時有時候會出現這樣的問題,字母 H 的兩個豎筆畫不一樣粗,這通常跟字母在屏幕上的位置有關,為了解決類似的問題,字體設計時都會提供一些額外的信息來根據輸出設備的分辨率調整筆畫。這就是 Hint 機制,或者叫 Grid-Fitting。由于 Hint 的存在,同一個字母在不同的設備上輸出會有不同的寬度,這對排版有很大影響。所見即所得的排版要求我們在屏幕和紙上有相同的排版結果。如果我們按照理論值排版,在屏幕上我們可能會看到不美觀的輸出,參見截圖。如果我們按照屏幕 Fitting 值排版則不能夠最大化的利用字體設計師的工作,他們仔細調整過的字寬不能在紙上還原。

下圖是個程序示例(Java),展示了不同的渲染方式會得到不同的字體寬度和不同的渲染結果。圖中左右半部分分別是沒有使用反鋸齒(左)和使用反鋸齒(右)的效果,而圖中上下半部分分別是使用整數坐標(上)和使用分數坐標(下)的效果。

在圖上可以看出使用分數坐標的 M 具有不一致的間距。所有的這些都對實現“所見即所得”的排版軟件帶來了很大困難,在 FreeType 的主頁上有一些有關的文章,參見這里。其中提出了兩種解決方案:

There are two ways to achieve this: either use the scaled and unhinted glyph metrics when laying out text both in the rendering and printing processes, or simply use whatever metrics you want and store them with the text in order to get sure they are printed the same on all devices (the latter being probably the best solution, as it also enables font substitution without breaking text layouts).

為了確定主流排版/字處理軟件是如何解決這個問題的,我使用同樣的基準文檔(Tahoma 12pt 大寫 M)做了測試。在 MS Word 2007 & MS Word 2003 中的結果如下:

可以看出 MS Word 的渲染結果也有不一致的間距,另外每個 M 字符都完全相同,這意味著 MS Word 是將一個字符渲染出來,然后不斷的貼圖。這也是常見的做法,優點是速度快,不需要在每個位置重復渲染。

在 Adobe InDesign 中以高質量顯示的結果如下:

可以看出 InDesign 的渲染結果也有不一致的間距,但是明顯 Adobe 具有更好的反鋸齒算法,視覺上很難發現不同,但放大后還是能夠看得比較清楚。另外 InDesign 的每個 M 字符都不相同,也就是說 InDesign 是對每個字符單獨進行渲染,難怪效果會好。

結論

1. 使用設備無關的(高精度的)方式進行排版.

2. 顯示效果不好時,使用每個字符單獨渲染的策略.

3. 有些時候需要根據輸出設備的限制進行 Grid Fitting,比如在 AFP 中對字符的位置/寬度有很大限制.

轉載于:https://www.cnblogs.com/songtzu/p/3542301.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258953.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258953.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《SQL初學者指南(第2版)》——2.4 指定列

本節書摘來自異步社區出版社《SQL初學者指南(第2版)》一書中的第2章,第2.4節,作者:【美】Larry Rockoff,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.4 指定列 到目前為止,我們只…

python從文件中提取特定文本_使用Python從HTML文件中提取文本

我發現最好的一段代碼用于提取文本,而不需要javascript或不需要的東西:import urllibfrom bs4 import BeautifulSoupurl "http://news.bbc.co.uk/2/hi/health/2284783.stm"html urllib.urlopen(url).read()soup BeautifulSoup(html)# kill …

mutable、volatile的使用

本文轉載自http://blog.csdn.net/tht2009/article/details/6920511 (1)mutable 在C中,mutable是為了突破const的限制而設置的。被mutable修飾的變量,將永遠處于可變的狀態,即使在一個const函數中,甚至結構體變量或者類對象為const…

文本框點擊后文字消失總結

1.文本框顯示默認文字&#xff1a; <textarea>白鴿男孩</textarea> <textarea>白鴿男孩</textarea>    2.鼠標點擊文本框&#xff0c;默認文字消失&#xff1a; <textarea οnfοcus”if(value’白鴿男孩’) {value’ ‘}”>白鴿男孩</text…

[裴禮文數學分析中的典型問題與方法習題參考解答]4.5.8

需要全部的解答, 請 http://www.cnblogs.com/zhangzujin/p/3527416.html 設 $f(x)$ 在 $[a,\infty)$ 上可微; 且 $x\to\infty$ 時, $f(x)$ 單調遞增趨于 $\infty$, 則 $$\bex \int_a^\infty \sin f(x)\rd x,\quad \int_a^\infty \cos f(x)\rd x \eex$$ 都收斂. 證明: 由 $$\be…

《PowerShell V3——SQL Server 2012數據庫自動化運維權威指南》——2.13 創建視圖...

本節書摘來自異步社區出版社《PowerShell V3—SQL Server 2012數據庫自動化運維權威指南》一書中的第2章&#xff0c;第2.13節&#xff0c;作者&#xff1a;【加拿大】Donabel Santos&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.13 創建視圖 本方案展…

python刷抖音_用Python生成抖音字符視頻!

抖音字符視頻在去年火過一段時間。 反正我是始終忘不了那段極樂凈土的音樂... 這一次自己也來實現一波&#xff0c;做一個字符視頻出來。 主要用到的庫有cv2&#xff0c;pillow庫。 原視頻如下&#xff0c;直接抖音下載的&#xff0c;妥妥的水印。 不過并不影響本次的操作。 / …

變長參數

轉載自&#xff1a;http://blog.csdn.net/tht2009/article/details/7019635 變長參數 設計一個參數個數可變、參數類型不定的函數是可能的&#xff0c;最常見的例子是printf函數、scanf函數和高級語言的Format函數。在C/C中&#xff0c;為了通知編譯器函數的參數個數和類型可變…

第十七章 我國農業科學技術

農村改革解說&#xff08;專著&#xff09;第十七章 第十七章 我國農業科學技術 1、為什么說科學技術是生產力&#xff1f; 我們說科學技術是生產力&#xff0c;是因為在構成生產力的兩個主要因素中&#xff0c;都包含著科學技術在內。 A、生產力中人的因素是同一定的科學技術緊…

《淘寶網開店 拍攝 修圖 設計 裝修 實戰150招》一一1.2 選購鏡頭時應注意的事項...

本節書摘來自異步社區出版社《淘寶網開店 拍攝 修圖 設計 裝修 實戰150招》一書中的第1章&#xff0c;第1.2節&#xff0c;作者&#xff1a; 葛存山&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 1.2 選購鏡頭時應注意的事項 面對如此之多的鏡頭&#xf…

OpenCV中的神器Image Watch

Image Watch是在VS2012上使用的一款OpenCV工具&#xff0c;能夠實時顯示圖像和矩陣Mat的內容&#xff0c;跟Matlab很像&#xff0c;方便程序調試&#xff0c;相當好用。跟VS2012配合使用&#xff0c;簡直就是一款神器&#xff01;讓我一下就愛上它了&#xff01; 下面介紹一些鏈…

python異步_Python通過Thread實現異步

當long函數耗時較長時&#xff0c;需要程序先向下執行&#xff0c;這就需要異步&#xff0c;改寫代碼如下&#xff1a; import _thread import time def long(cb): print (long execute) def fun(callback): time.sleep(5) result long end callback(result) _thread.start_ne…

SAM4E單片機之旅——13、LCD之ASF初步

在Atmel Studio 6中&#xff0c;集成了Atmel Software Framework&#xff08;ASF框架&#xff09;。通過它提供的庫&#xff0c;可以很快速地完成新的項目。 這次的最終目標使用ASF在LCD上顯示出文字“Hello World!”&#xff0c;現階段目標是點亮LCD的背光&#xff0c;學習目標…

《HTML5與CSS3實戰指南》——2.2 基本的HTML5模板

本節書摘來自異步社區《HTML5與CSS3實戰指南》一書中的第2章&#xff0c;第2.2節,作者&#xff1a; 【美】Estelle Weyl , Louis Lazaris , Alexis Goldstein 更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.2 基本的HTML5模板 在您學習HTML5和新技術時&#xff0c;您…

c# Message const

typeTMsg packed recordhwnd: HWND; //窗口句柄message: UINT;//消息常量標識符wParam: WPARAM ;// 32位消息的特定附加信息lParam: LPARAM ;// 32位消息的特定附加信息time: DWORD;//消息創建時的時間pt: TPoint; //消息創建時的鼠標位置end ; 消息中有什么&#xff1f;是否覺…

OpenCV坐標體系的初步認識

實驗基礎本次實驗通過一個簡短的例子&#xff0c;主要來說明下面4個問題&#xff1a; 1. 坐標體系中的零點坐標為圖片的左上角&#xff0c;X軸為圖像矩形的上面那條水平線&#xff1b;Y軸為圖像矩形左邊的那條垂直線。該坐標體系在諸如結構體Mat,Rect,Point中都是適用的。&…

python爬取知乎live_Python爬蟲 - 簡單抓取百度指數

前言有點忙&#xff0c;沒空寫東西&#xff0c;這是之前寫的&#xff0c;加了些配圖而已 這次要爬的網站是百度指數 正文 一、分析 打開網站(百度指數)&#xff0c;呈現出來是這樣的 如果搜索的話就需要登陸了&#xff0c;如果沒有什么特別頻繁的請求的話&#xff0c;直接登陸復…

在Visual Studio上開發Node.js程序

在Visual Studio上開發Node.js程序 原文:在Visual Studio上開發Node.js程序【題外話】 最近準備用Node.js做些東西&#xff0c;于是找找看能否有Visual Studio上的插件以方便開發。結果還真找到了一個&#xff0c;來自微軟的Node.js Tools for Visual Studio&#xff08;NTVS&a…

Oracle ASM 翻譯系列第十一彈:高級知識 Offline or drop?

Offline or drop? 當一個ASM磁盤不可用時&#xff0c;ASM會把它從磁盤組里移除&#xff0c;對嗎&#xff1f;要看情況&#xff0c;通常取決于ASM版本和磁盤組的冗余級別。因為一個external冗余的磁盤組會直接被dismount&#xff0c;所以主要關注normal和high冗余磁盤組的情況。…

net與樹莓派的情緣-安裝與卸載MySql(五)

安裝MySql sudo apt-get install mysql-server 刪除 mysql sudo apt-get autoremove --purge mysql-server-5.0sudo apt-get remove mysql-serversudo apt-get autoremove mysql-serversudo apt-get remove mysql-common //這個很重要上面的其實有一些是多余的。 清理殘留數據 …