PHP函数Imagettftext(),用于写入带有表情符号的文本

人气:91 发布:2023-01-03 标签: php emoji imagettftext

问题描述

我正在使用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计算机上。

来源:1和2

最后一种方法是我们感兴趣的。这是因为imagefttext是由PHP GD扩展提供的函数。而GD内部使用的是FreeType库来绘制文本。

从2.5版开始,在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

10