国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Freetype的終端設備字體繪制方案的研究

2024-06-20 04:22:07葸鑫胡彪任繼翔
中國新通信 2024年6期
關鍵詞:字符串指針字符

葸鑫 胡彪 任繼翔

摘要:Freetype引擎是一個十分重要的字體繪制工具,被廣泛運用于眾多有文字繪制需求的應用場景中。在當前的大量字體繪制解決方案中,首先將Freetype中的字體輪廓數(shù)據(jù)轉換為位圖,然后再進行繪制。但這樣的方式使得在放大顯示等場景下字體存在邊緣模糊或出現(xiàn)鋸齒等問題?;诖?,本文提出了一種將VG技術與Freetype引擎相結合的字體渲染方案,以實現(xiàn)繪制的字體在放大、旋轉等操作時不失真且具有良好的矢量特性,從而達到更好的字體繪制效果。

關鍵字:Freetype; VG圖形;字體繪制;數(shù)據(jù)解析

一、引言

在技術飛速發(fā)展的今天,各類顯示設備已經(jīng)深深融入了人們生活的方方面面,如電子手表、智能手環(huán)、洗衣機、冰箱、平板電腦觸摸屏和電子廣告牌等。它們在各自的應用場景下為人們的日常生活提供了極大的便利,可視化的交互方式方便人們操作這些設備。這些設備上顯示的內容主要有圖形和文字兩類,顯示屏上的文字指導人們日常操作,

終端設備上顯示的字體主要涉及兩項關鍵技術。其一是獲取待顯示字符的輪廓數(shù)據(jù),其二是將輪廓數(shù)據(jù)渲染并繪制到顯示屏上。其中,字符輪廓數(shù)據(jù)的獲取可由Freetype字體渲染引擎完成;而輪廓數(shù)據(jù)的繪制和顯示可由OpenGL、OpenCV或OpenVG等開源圖形庫完成。

二、Freetype字體渲染引擎和VG技術

Freetype是一種開源的字體渲染引擎,最早于1996年由David Turner開發(fā)[1],并以開源的形式面向全球。在計算機圖形學中,字體的渲染和繪制是一個非常重要但也十分復雜的領域。在實際社會生活中,需要準確、高效地顯示字體的需求非常多,F(xiàn)reetype的出現(xiàn)為解決這個技術難題提供了強大而簡便的方法。它具有強大的字體解析能力和出色的字體渲染功能,在移動設備、應用程序、各種操作系統(tǒng)和圖形項目中被廣泛和頻繁地使用[2]。Freetype的一個顯著優(yōu)勢是在主流操作系統(tǒng)(如Linux、Windows和Mac OS)中提供支持,并具有先進的算法和技術。通過實現(xiàn)子像素和抗鋸齒等技術,字體圖像可以在不同的圖像尺寸和分辨率下保持清晰和平滑。Freetype的核心功能包括解析字體文件、繪制渲染字體輪廓等,并且支持多種字體,包括TrueType和OpenType。它可以解析和繪制不同的字體,并獲得相同的渲染效果,為應用程序的開發(fā)和兼容性提供了極大的便利。

VG矢量圖是一種基于矢量描述的精確曲線和形狀的圖像表示方法,它使用數(shù)學公式來定義和繪制圖像[3]。由于VG圖形保存的是圖形的幾何形狀和曲線的信息,因此可以對圖像進行旋轉和縮放等操作,并具有文件大小、尺寸獨立等優(yōu)點。VG技術被廣泛應用于數(shù)據(jù)可視化、計算機輔助設計和地理信息系統(tǒng)等領域。

三、基于VG技術的字體繪制方案

在現(xiàn)有的字體繪制方案中,通常使用Freetype將矢量的字體圖形轉換為位圖,再將位圖渲染至實現(xiàn)設備上。然而,位圖由像素陣列組成,每個像素點都帶有顏色信息來表示圖像。高分辨率的位圖能夠很好地展示圖像的細節(jié),但它存在分辨率固定的缺點,同時圖像放大會引起邊緣失真和鋸齒效應。

從技術角度而言,將矢量字體圖形轉換為位圖的過程會丟失其矢量特性。如果在屏幕上放大字體,圖像的清晰度就會降低。雖然在大多數(shù)應用場景中,以較小的圖像大小來顯示字體時這種損失并不明顯。但實際上,F(xiàn)reetype獲得的字形輪廓數(shù)據(jù)本身就是矢量數(shù)據(jù),這與VG技術擅長處理的數(shù)據(jù)類型非常匹配。通過VG技術,可以以矢量圖形的形式將字體數(shù)據(jù)繪制到屏幕上,有效地保留了矢量圖形的伸縮性,從而在顯示設備上呈現(xiàn)更好的字體顯示效果。因此,將VG技術和Freetype字體渲染引擎結合起來,以完成對字體的繪制和渲染,是一個理想的解決方案。

VG技術與Freetype相結合的終端設備字體繪制方案主要包含以下步驟:首先,在系統(tǒng)上安裝OpenVG和Freetype以獲取功能支持。由于這兩個工具都是開源技術,所以它們的下載和安裝非常簡單。在Windows系統(tǒng)下,只需下載相應的庫文件和頭文件;而在Linux系統(tǒng)平臺上,需要下載源文件,并通過交叉編譯的方式編譯出適用于特定平臺的庫文件。

對于OpenVG工程,首先需要進行初始化,然后創(chuàng)建OpenVG上下文(context),用于存儲VG的當前狀態(tài)信息和圖像的繪制信息等。接下來,設置OpenVG相關的狀態(tài)參數(shù),例如當前畫布大小和顏色格式等初始化信息。然后在OpenVG工程中初始化Freetype引擎,這包括鏈接庫文件以及在代碼中引入Freetype的頭文件和庫文件:

#include

#include FT_FREETYPE_H

使得能夠在OpenVG工程中調用Freetype的接口函數(shù)。二是調用FreeType接口函數(shù)FT_Init_FreeType()對Freetype引擎進行初始化,并將字體文件的文件名和路徑作為輸入?yún)?shù),使用FT_New_Face()函數(shù)接口加載所需要使用的字體文件,并可使用FT_Set_Char_Size()函數(shù)接口設置字體的大小。不同的字體文件都能夠提供不同的字體字形,F(xiàn)reetype涵蓋了大多數(shù)常用的字體格式,根據(jù)需要提前準備好字體文件,其中最為常見的字體是TrueType文件(文件以.ttf為后綴),最初由微軟和蘋果公司共同開發(fā),用于高質量地渲染和顯示的文字,并能夠確??缙脚_應用的一致性。由于其具有可縮放性、良好的嵌入性和高效的性能,被廣泛地應用于操作系統(tǒng)、桌面出版、網(wǎng)頁設計等領域[4],并且有越來越多的開發(fā)者開發(fā)出了TrueType格式的精美字體,進一步豐富和完善了TrueType庫。

最后是字體的繪制。使用OpenVG的接口函數(shù)創(chuàng)建圖像畫布,用于存儲待繪制字體的相關信息。針對每個待繪制的字體數(shù)據(jù),使用接口函數(shù)FT_Load_Char()從字體文件中加載對應字形的數(shù)據(jù),并在Freetype引擎中轉化為字體的輪廓數(shù)據(jù)后傳出。然后使用OpenVG的繪圖函數(shù)將圖像繪制于初始化后的圖像畫布上,最后使用顯示函數(shù)將圖像畫布上的字體圖形渲染至待顯示設備的待顯示區(qū)域中,從而完成了字體的整個流程。

OpenVG和Freetype都提供了十分豐富的繪圖函數(shù),可根據(jù)實際的字體繪制需求進行特異性的優(yōu)化和配置,充分合理地使用OpenVG的函數(shù)接口可實現(xiàn)復雜、精美的字體渲染效果,如藝術字體,傾斜字體,字體鏡像反射效果等。將Freetype和VG技術相結合來繪制字體的方案的一大優(yōu)勢在于,該方案擁有良好的可擴展性,例如,在復雜的繪制場景下,如果需要額外使用其他的圖形庫來輔助字體的繪制和渲染,可將OpenGL ES引入系統(tǒng)用于創(chuàng)建和管理OpenVG的上下文信息,以便于字體圖形的繪制和管理;如有 對圖像顯示有更高幀率的要求,可在方案中引入額外的顯示模塊,用于加速字體圖形到繪制屏幕的數(shù)據(jù)傳輸。

四、矢量圖繪制的關鍵技術

Freetype提供了字體的輪廓數(shù)據(jù)。在當前的常規(guī)字體繪制解決方案中,通常使用Freetype引擎中的FT_Render_Glyph()接口函數(shù),將字體的輪廓轉換為位圖的形式后再進行繪制渲染。這會使得在字體進行放大操作后再繪制的場景下產生輪廓邊緣失真、清晰度降低等問題。在Freetype引擎中提供的原始輪廓數(shù)據(jù)是字形的若干個輪廓關鍵點,以及相鄰關鍵點間的連接方式等信息,這高度契合了VG技術輸入數(shù)據(jù)的形式。而VG技術能夠使得字形以矢量圖的形式進行渲染和繪制,具有旋轉、縮放不變性,意味著圖像無論在屏幕多大的顯示場景中繪制,均能夠任意縮放和旋轉而不損失細節(jié)信息或產生鋸齒狀的邊緣,這在社會生產生活中有極其重要的價值。但在Freetype引擎中由接口函數(shù)FT_Load_Char()獲取到的字形輪廓數(shù)據(jù)并不能作為VG技術的輸入數(shù)據(jù)直接傳輸,其原因在于OpenVG中存在一種專有的被稱為路徑(Path)的矢量格式。但Freetype輸出的輪廓數(shù)據(jù)是以字符串的形式給出,因而需要將Freetype的輸出數(shù)據(jù)進行轉換。

本文提出了一種數(shù)據(jù)轉換方法。在OpenVG中,路徑(Path)數(shù)據(jù)是用于定義和描述矢量圖形的形狀,包括一系列命令和坐標參數(shù)。OpenVG中常用的路徑數(shù)據(jù)格式有:

MoveTo:用于將當前的繪制坐標點移動至參數(shù)指向的特定坐標點,如命令“M10 10”表示將當前繪圖坐標點移動到(10,10)處。

LineTo:用于將繪制一條直線連接當前位置和目標位置,如命令“L10 10”表示從當前點繪制一條直線至(10,10)處。

CurveTo:用于繪制出一條貝塞爾曲線連接當前點和目標點,如命令“C10 10”表示從當前點繪制一條貝塞爾曲線至(10,10)處。

QuadTo:用于繪制一條二次貝塞爾曲線連接當前點和目標點,如命令“Q10 10”表示從當前點繪制一條二次貝塞爾曲線至(10,10)處。

在VG程序中,需要將繪圖指令和具體的坐標點數(shù)據(jù)分別傳輸?shù)絇ath結構體中。然而,從Freetype引擎中獲取得到的字形輪廓為一段連續(xù)的字符串,例如字符“A”的輪廓數(shù)據(jù)為:“M 18 -45 L 27 -3 Q 27 1 31 1 L 31 3 L 19 1 Q 22 1 22 -1 Q 22 -2 22 -3 L 19 -15 L 7 -2 L 7 -1 Q 7 1 10 1 L 10 3 L 1 3 L 1 1 Q 4 1 5 -2 L 15 -44 L 18 -45 M10 -17 L 19 -17 L 15 -37 L 10 17”。因此,需要將這段字符串分別解析為控制指令和坐標數(shù)據(jù)。以下闡述一種解析算法,在獲取字符輪廓數(shù)據(jù)的字符串后開始對字符串進行解析,定義指針n指向字符的某一位置,定義指針p從字符串的首地址開始遍歷,并遵循以下遍歷規(guī)則:

(1)如果指針p當前所指向的內容為空,則指針p后移一位;

(2)如果指針p當前所指向的內容為“M”“C”“L”或“Q”等繪制指令,則記錄當前指令,且指針p后移一位;

(3)如果指針p當前所指向的內容為字符“0”至字符“9”,便將指針n移動至當前位置,指針p后移至所指向的內容為空處,則指針p與指針n中間所指向的內容即為一個坐標數(shù)據(jù)。緊接著將字符串類型的坐標數(shù)據(jù)轉化為整數(shù)類型后進行保存。

(4)指針p遍歷至輪廓數(shù)據(jù)字符串的末尾,算法結束。

其中字符串數(shù)據(jù)類型的坐標數(shù)據(jù)轉換為整數(shù)類型的坐標數(shù)據(jù)的具體方法是將該數(shù)據(jù)保存為一個新的字符串,定義指針s從該字符串起始地址開始遍歷;將指針s所指向的第一個字符類型的數(shù)字與字符“0”做差,即將當前字符的ASCII值與字符“0”的ASCII值的差,其結果為當前字符所對應的整數(shù)類型的數(shù)字;然后將指針s后移1位,按上述方法解析得到當前位的整數(shù)類型的數(shù)字,并將上一個解析得到的數(shù)字乘10后加上當前位數(shù)字,得到的結果記為A1;如果指針s指向的下一位置仍存在字符s1,則將A1乘10后加上s1所對應的整數(shù)數(shù)字,得到的結果記為A2;按照上述方法繼續(xù)計算,直至指針s將字符串完全遍歷,最后得到結果An。由此便能夠將字符串類型的數(shù)字轉為對其對應的十進制的整數(shù)類型的數(shù)。

以字符“A”的輪廓數(shù)據(jù)解析為例,詳細闡述算法流程,將“A”的輪廓數(shù)據(jù)記為ch,指針n初始指向ch的首地址,指針p從ch的首地址開始遍歷。指針p指向的第一個字符為“M”,由于“M”是路徑Path的控制指令之一,則將其進行存儲;緊接著指針p后移一位,所指向的內容為空,則繼續(xù)后移一位;然后指針p所對應的內容為字符“1”,則開始坐標點的解析,將指針n移動至當前位置,指針p繼續(xù)后移至第一次所指向的內容為空后停止,此時由指針p和指針n的地址做差可獲得第一個解析的數(shù)據(jù)為字符“18”;然后用字符“1”和字符“0”做差得到整數(shù)類型的數(shù)字1,用字符“8”和字符“0”做差得到整數(shù)類型的8,將數(shù)字1乘10后加上數(shù)字8便得到了整數(shù)類型的18,由此將字符“18”轉換為了整數(shù)18,并將其保存為第一個坐標點的數(shù)據(jù)。指針s繼續(xù)遍歷獲得字符“-45”,按上述方法轉化為整數(shù)45并取負值后進行數(shù)據(jù)存儲,由此便完成了第一段指令“M 18 -45”的指令解析。依此規(guī)則,讓指針p遍歷完字符串后便能夠解析得到所有字符“A”的輪廓數(shù)據(jù)和繪制指令,有了矢量形式的輪廓數(shù)據(jù)便能夠用VG技術繪制出矢量字形。

漢字的繪制方法。對于待繪制字符的輪廓數(shù)據(jù),可以用Freetype中的FT_Get_Char_Index()獲取當前字符的索引,再利用該索引通過函數(shù)接口FT_Load_Glyph()獲取輪廓數(shù)據(jù)。對于常用的字符,如26個英文字符的大小寫、加號、減號等,它們的ASCII值和Unicode編碼是一致的,因此直接將這些字符作為傳入?yún)?shù)傳入接口函數(shù)FT_Get_Char_Index()中就能獲取到它們索引值,進而得到輪廓數(shù)據(jù)。但接口函數(shù)FT_Get_Char_Index()的字形編碼輸入?yún)?shù)類型是Unicode編碼,而中文字符并不能直接獲取到其對應的Unicode編碼,需要進行一定的轉換。以下闡述一種漢字的Unicode編碼轉換方法:

(1)定義指針p指向漢字字符串的首地址,依次遍歷漢字字符串中的每個字符,直到遇到字符串的結束符。

(2)從第一個字符開始遍歷,首先獲取其字符編碼,并使用無符號字符ch表示。

(3)利用位運算的方法確定當前字符的Unicode編碼的類型,具體為根據(jù)其編碼的高四位確定其所占的字節(jié)數(shù):若高四位中的最高位為1,則該字符為單字節(jié)字符;若高四位中的高兩位均為1,則該字符為雙字節(jié)字符;若高四位中的高三位均為1,則該字符為三字節(jié)字符。

(4)若當前字符為單字節(jié)字符,則其編碼范圍在ASCII字符范圍內,其ASCII值即為Unicode值;若該字符為雙字節(jié)字符,則需要將當前字符的后五位先左移六位后,將結果以位運算的方式與下一個字符進行計算便能夠得到其Unicode值;若該字符為三字節(jié)字符,則需要將當前字符編碼的后四位左移12位,并將下一字符的后六位左移六位,最后再與正序第二個字符的后六位的方式計算得到其Unicode值。

計算得到漢字字符的Unicode編碼后,傳入FT_Get_Char_Index()接口函數(shù)中獲取到漢字的輪廓索引,再利用該索引通過函數(shù)FT_Load_Glyph()便能夠得到其輪廓數(shù)據(jù)。

五、結束語

針對日益增長的移動端設備的字體繪制需求,本文提出了一種將VG技術和Freetype引擎相結合的字體繪制方案。該方案旨在更加高效、高質量地繪制字體圖像。同時,本文介紹了一種將Freetype引擎中輸入的字符串類型的字體輪廓數(shù)據(jù)轉換成VG技術所需的控制指令和坐標點形式的輪廓數(shù)據(jù)的解析方法,以及一種漢字Unicode編碼的轉換方法?;谶@些技術,實現(xiàn)了字體的矢量繪制和渲染。

作者單位:葸鑫 胡彪 任繼翔 成都大公博創(chuàng)信息技術有限公司

參考文獻

[1] 霍長和.基于FreeType的ttf字體算法研究與應用[D].長春工業(yè)大學, 2017.

[2] 黃秀珍,何加銘,邰曉英.基于FreeType嵌入式矢量字體引擎的研究[J].寧波大學學報(理工版), 2010, 23(04): 56-61.

[3] 唐善成,魯彪,張雪等.面向漢字矢量圖形特征的字向量表征方法[J].科學技術與工程, 2023, 23(16): 6967- 6973.

[4] 廖平,楊德友,劉仁喜.一種激光打標中TrueType字體輪廓直線逼近優(yōu)化算法[J].激光技術, 2016, 40(04): 483- 486.

猜你喜歡
字符串指針字符
尋找更強的字符映射管理器
字符代表幾
一種USB接口字符液晶控制器設計
電子制作(2019年19期)2019-11-23 08:41:50
偷指針的人
娃娃畫報(2019年5期)2019-06-17 16:58:10
消失的殖民村莊和神秘字符
為什么表的指針都按照順時針方向轉動
基于改進Hough變換和BP網(wǎng)絡的指針儀表識別
電測與儀表(2015年5期)2015-04-09 11:30:42
ARM Cortex—MO/MO+單片機的指針變量替換方法
一種新的基于對稱性的字符串相似性處理算法
依據(jù)字符串匹配的中文分詞模型研究
洪江市| 湖南省| 称多县| 盘锦市| 莎车县| 横峰县| 轮台县| 射阳县| 龙门县| 弥渡县| 文水县| 固始县| 泽普县| 时尚| 延吉市| 江口县| 独山县| 九寨沟县| 安龙县| 万州区| 惠水县| 隆安县| 修武县| 宝山区| 融水| 浦北县| 永定县| 张家川| 尉氏县| 庄浪县| 扎鲁特旗| 昂仁县| 寻甸| 灌云县| 日喀则市| 盐城市| 临泉县| 贵港市| 江山市| 榆树市| 库尔勒市|