日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php在图片上绘制汉字之imageTtfText()函数

發布時間:2024/9/19 php 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php在图片上绘制汉字之imageTtfText()函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖片處理,是許多程序的功能之一;而文字渲染則是繪圖的基本組成部分。PHP通過很多擴展庫來支持圖片的處理,最常用的還是GD庫,通過一系列imagexxx()函數來提供繪圖功能。本文專注于非常細小的一點:繪制文字。熟悉Win32的人都知道,TextOut()就可以輕松顯示任何文字了,然而到了PHP的世界里,有些事情并不輕松。
1 詳細解釋imageTtfText()函數

對于PHP繪圖初學者,首先遇到的一個問題就是,imageString()這個函數并不支持漢字的繪制。這往往會給入門者當頭一棒,不過不要著急,因為還有一個imageTtfText()函數,這個函數能繪制UTF-8編碼的字符串,當然可以繪制漢字了。然而使用它并不十分簡單。先來看看其原型聲明:

?


一共有8個參數,缺一不可,而且官方文檔這些參數的解釋并不透徹,這里筆者盡力做更詳細清晰的解釋:
(1)$image 這個是畫布資源,無需再解釋;
(2)$size,官方文檔的解釋是,字體大小,其長度單位依賴于GD庫的版本,對于GD1來說是像素,對于GD2來說是磅(point)?,F在一般都是GD2了,那么這個磅究竟是什么意思呢?這涉及到字體設計的基本知識。

簡單來說,磅是一個長度度量單位,如果把一英寸等分成72份,每一份就是1磅。這里需要強調的是,磅是個絕對物理單位,與顯示設備無關。

而像素呢?像素沒有固定的大小,而是與分辨率相關,高分辨率的顯示器像素就很小,如iphone視網膜屏上一個像素的大小要比普通LCD顯示器的像素小很多。然而有些東西是不存在分辨率這個概念的,如單純的位圖圖片,它的最小組成部分就是像素,本身也是通過每個像素的顏色值來定義的。把同樣的圖片顯示在不同分辨率的顯示器上,最終呈現出的大小是不同的。

操作位圖時,以像素位單位最精確合理,那么使用GD2庫的時候,如何繪制大小為20像素的字呢?也就是多少磅才能等于20個像素呢?這必須通過分辨率才能計算出來,而問題是位圖本身并沒有分辨率的概念。

現在把問題返回來,如果給定$size=20磅,那么imageTtfText()繪制完成時,究竟會占用多少像素。無論如何,imageTtfText()最終還是要把文字繪制落實到具體的位圖像素上。

1磅 = PPI/72 個像素

這個問題確實非常棘手,此函數內部必然會使用某個分辨率PPI來計算被渲染的像素區域。而GD2庫卻沒有提供任何讓用戶設置或者讀取這個分辨率的方法。那么,我們只能動手測試了。使用不同的磅值繪制文字,然后測量文字占據的像素,通過公式:
PPI = (72*像素數)/磅值。實驗得出的結論是:
?

1磅==>4像素, PPI=288 2磅==>5像素, PPI=180 3磅==>7像素, PPI=168 4磅==>8像素, PPI=144 5磅==>9像素, PPI=129.6 6磅==>10像素, PPI=120 7磅==>11像素, PPI=113.14285714286 8磅==>12像素, PPI=108 9磅==>14像素, PPI=112 10磅==>15像素, PPI=108 11磅==>16像素, PPI=104.72727272727 12磅==>17像素, PPI=102 13磅==>18像素, PPI=99.692307692308 14磅==>19像素, PPI=97.714285714286 15磅==>21像素, PPI=100.8 16磅==>22像素, PPI=99 17磅==>23像素, PPI=97.411764705882 18磅==>25像素, PPI=100 19磅==>26像素, PPI=98.526315789474 20磅==>27像素, PPI=97.2 21磅==>28像素, PPI=96 22磅==>29像素, PPI=94.909090909091 23磅==>30像素, PPI=93.913043478261 24磅==>32像素, PPI=96 25磅==>33像素, PPI=95.04 26磅==>34像素, PPI=94.153846153846 27磅==>35像素, PPI=93.333333333333 28磅==>36像素, PPI=92.571428571429 29磅==>38像素, PPI=94.344827586207 30磅==>39像素, PPI=93.6 31磅==>40像素, PPI=92.903225806452 32磅==>41像素, PPI=92.25 33磅==>43像素, PPI=93.818181818182 34磅==>44像素, PPI=93.176470588235 35磅==>46像素, PPI=94.628571428571 36磅==>47像素, PPI=94 37磅==>48像素, PPI=93.405405405405 38磅==>48像素, PPI=90.947368421053 39磅==>50像素, PPI=92.307692307692 40磅==>51像素, PPI=91.8 41磅==>52像素, PPI=91.317073170732 42磅==>53像素, PPI=90.857142857143 43磅==>55像素, PPI=92.093023255814 44磅==>56像素, PPI=91.636363636364 45磅==>57像素, PPI=91.2 46磅==>58像素, PPI=90.782608695652 47磅==>60像素, PPI=91.914893617021 48磅==>62像素, PPI=93 49磅==>63像素, PPI=92.571428571429 50磅==>63像素, PPI=90.72 51磅==>64像素, PPI=90.352941176471 52磅==>67像素, PPI=92.769230769231 53磅==>68像素, PPI=92.377358490566 54磅==>69像素, PPI=92 55磅==>70像素, PPI=91.636363636364 56磅==>71像素, PPI=91.285714285714 57磅==>72像素, PPI=90.947368421053 58磅==>74像素, PPI=91.862068965517 59磅==>75像素, PPI=91.525423728814 60磅==>76像素, PPI=91.2 61磅==>77像素, PPI=90.885245901639 62磅==>78像素, PPI=90.58064516129 63磅==>79像素, PPI=90.285714285714 64磅==>81像素, PPI=91.125 65磅==>83像素, PPI=91.938461538462 66磅==>84像素, PPI=91.636363636364 67磅==>85像素, PPI=91.34328358209 68磅==>86像素, PPI=91.058823529412 69磅==>86像素, PPI=89.739130434783 70磅==>88像素, PPI=90.514285714286 71磅==>90像素, PPI=91.267605633803 72磅==>91像素, PPI=91 73磅==>92像素, PPI=90.739726027397 74磅==>93像素, PPI=90.486486486486

可見當大于46磅時,PPI穩定在90,而小于46磅時,PPI一直在微變。
所以,如果你想繪制20個像素大小的字體,那么必須設置$size參數為:14.5磅。
另外需要注意的是,$size并不完全對應字體的顯示大小,因為同樣的$size,不同的字符占據的空間并不是一樣的。例如,漢字“國”的寬度會比數字1的寬度大得多,對于標點符號,則更是這樣,半角和全角符號也不同。
總之,使用imageTtfText()不可能精確控制到像素級別,只能大概。這也算是矢量字體的一個小缺陷。

(3)$angle是旋轉角度。這個官網解釋的比較清楚,需要說明有兩點:一是角度單位是度而不是弧度,二是旋轉的中心點就是參數$x,$y。

(4)(5)$x,$y 被繪制字符串的第一個字符的基線點。單位是像素。這里涉及到字體設計的基本知識--基線。這個點絕對不是左上角,而具體是什么取決于所使用的字體是如何設計的。對于宋體、楷體、黑體等常見的字體中的漢字,這個點大概位于字體的左下部分;而對于英文字母和標點符號,則各不相同。如下圖:
?

(6)$color 字體的顏色,不多解釋。

(7)$fontfile 字體文件。也就是包含trueType字體字模的文件,如楷體字體文件simkai.ttf。這種文件的格式是有標準規范的,而且與平臺無關。所以可以直接把Windows系統的字體文件拷貝到Linux下使用。

(8)$text 要渲染的字符串。需要注意必須是UTF-8編碼的字符串。說到字符串不得不提PHP的string數據類型。雖然名為string,其實PHP語言本身并不認識各種字符編碼,它只是簡單的把string看做是動態增長的“字節”數組,例如strlen()就是返回的字節數。而我們知道除了ASCII編碼的字符和字節是相同的外,幾乎沒有其他字符編碼中的字符對應一個字節,例如一個漢字的UTF-8編碼占用3個字節。至于怎么解釋其中的字符編碼,需要專門的庫函數如iconv_strlen()。如果字符串使用字面量,那么其所在的php源文件就必須編碼為UTF-8存儲。

2 幾個小技巧
(1)字處理軟件的復雜之處
盡管這個函數可以顯示字符串,但是針對于字處理軟件(如Word)來說,并不能使用。因為一旦涉及到對其的問題,此函數即不能使用了。因為它不能處理字間距,當然也就無法實現分散對齊等功能。再加上每行的“避首尾”(如,不能位于行首)要求,做好字處理并不簡單。

變通的方式是,首先通過復雜的公式計算出各個字符的準確位置,然后針對每一個字符調用此函數。

(2)如何顯示加粗字體
對于本身就有粗體的字體文件來說,這不存在任何問題,只要使用粗體文件就可以了。問題是很多字體文件并沒有針對粗體單獨設計。GD庫中也沒有一個能加粗顯示的函數。其解決方法說出來有點可笑,就是針對每個字符繪制兩次,第二次繪制時的$x會第一次的$x多1個像素即可。
?

轉自:https://blog.csdn.net/smstong/article/details/43955705

總結

以上是生活随笔為你收集整理的php在图片上绘制汉字之imageTtfText()函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。