PHP函數Imagettftext(),用于寫入帶有表情符號的文本 [英] PHP function imagettftext() to write text with smileys
問題描述
我正在使用Imagettftext函數在圖像上寫入文本,但我的文本包含表情符號,它將表情符號替換為方框
以下是mycode:
$black = imagecolorallocate ( $main_img, 0x00, 0x00, 0x00 );
$font_path = "Arial.ttf";
imagettftext ( $main_img, 14, 0, 73, 685, $black, $font_path, $text );
文本示例:
test testt?? Hello ???? Those ?? Mega x ???? Graphic ??
我已嘗試將字體更改為"Arial Unicode",但未解決問題。
如何解決此問題?
提前謝謝。
推薦答案
首先,我們需要了解emoji是如何實現的:
Apple PNG圖片(SBIX表)
Apple使用TrueType/OpenType規范的一個專有的、未發布的擴展來實現它,以將PNG圖像添加到字體中。然后,這些PNG圖像顯示在連續文本中。谷歌也實現了類似的東西,但它與蘋果的解決方案不兼容。
Mozilla和Adobe的SVG(SVG表)。
這兩家網絡巨頭為了最雄心勃勃的格式而走到了一起:OpenType中的SVG。我們不是將Unicode字符映射到字形,而是將其映射到SVG圖像。這為我們帶來了SVG的所有可愛的額外功能,包括漸變、嵌入的位圖圖像甚至動畫。從版本26開始,Firefox就已經支持它了!
Microsoft COLR/CPAL
默認情況下,新的Segoe UI Emoji字體的行為與常規TrueType/OpenType字體類似。它有Unicode編碼的、未上色的"基本字形"。但字體中還有兩個附加表:COLR表將作為層的附加字形鏈接到基本字形,并定義這些層的順序。并且CPAL(調色板)表為各個層存儲一個或多個調色板。(不同的調色板對于在深色和淺色背景上顯示字體非常有用。)因此,當支持這一新的顏色功能時,基本字形將被有色層替換。
Google的PNG圖片(CBDT/CBLC表)。
Google提出了一個使用PNG圖像作為字形的實現。字形只是簡單地被好的舊圖像所取代。這對較小的圖標很有效,顯然帶來了位圖圖像的所有創作自由,但伸縮性不是很好。放大一個足夠大的字形,你會遇到模糊的像素。用css更改字形的顏色即使不是不可能,也是很難的。有趣的是,他們指定在他們的實現中不應該有GLYF表--保存未上色的"正常"字形的表--因此,當這種格式不受支持時,看起來沒有退路。它已經在Android和Linux上使用的FreeType中實現,但如果提議使用OpenType,也會將其帶到Windows和Apple計算機上。
最后一種方法是我們感興趣的。這是因為imagefttext
是由PHP GD擴展提供的函數。而GD內部使用的是FreeType庫來繪制文本。
php -i
命令以查看您有什么版本的FreeType。這是我的:
FreeType Support => enabled FreeType Linkage => with freetype FreeType Version => 2.5.2
但是,在嘗試了我發現的一些示例字體here后,PHP一直拋出警告:
Warning: imagefttext(): Could not set character size
恐怕GD library不支持FT_LOAD_COLOR標志。此標志需要有彩色表情符號。請參閱自由類型更改日志:
2013-05-23 Behdad Esfahbod Add support for color embedded bitmaps (eg. color emoji). A new load flag, FT_LOAD_COLOR, makes FreeType load color embedded-bitmaps, following this draft specification https://color-emoji.googlecode.com/git/specification/v1.html
回答您的問題:您不能使用imagefttext
獲得彩色笑臉。對不起,??。
編輯:
您不能同時在GD中繪制黑白表情符號。這是因為GD僅支持1-3個多字節UTF-8字符。表情符號字符范圍屬于4字節UTF-8字符。
來源:https://github.com/libgd/libgd/blob/master/src/gdft.c#L341
帶有多字節UTF-8表示的表情符號表:http://apps.timwhitlock.info/emoji/tables/unicode
這篇關于PHP函數Imagettftext(),用于寫入帶有表情符號的文本的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!