首先,我们需要了解表情符号是如何实现的:
苹果的PNG图像(SBIX表)
苹果使用了一种专有的、未公开的TrueType/OpenType规范扩展来将PNG图像添加到字体中。这些PNG图像随后在文本中显示。Google也实现了类似的功能,但与苹果的解决方案不兼容。
Mozilla和Adobe的SVG(SVG表)
这两个网络巨头联手打造了最雄心勃勃的格式:OpenType中的SVG。我们不是将Unicode字符映射为字形,而是将其映射为SVG图像。这给我们带来了所有可爱的额外功能,包括渐变、嵌入式位图图像甚至动画。它已经在Firefox 26版本中得到支持!
Microsoft COLR/CPAL
默认情况下,新的Segoe UI Emoji字体的行为类似于常规的TrueType/OpenType字体。它具有Unicode编码的未着色“基本字形”。但字体中还有两个附加表:COLR表将附加字形链接为基本字形的层,并定义这些层的顺序。而CPAL(“颜色调色板”)表为各个层存储一个或多个颜色调色板。(不同的颜色调色板对于在深色和浅色背景上显示字体非常有用。)因此,当支持这种新的颜色功能时,基本字形将被着色层替换。
Google的PNG图像(CBDT/CBLC表)
Google提出了一种实现方案,使用PNG图像作为字形。字形被简单地替换为老式图片。这对于较小的图标效果很好,并且显然带来所有位图图像的创意自由,但不太适合扩大。将字形放大到足够大,就会遇到模糊的像素。而使用CSS更改字形的颜色也将变得困难,甚至不可能。有趣的是,他们指定在他们的实现中不应该有GLYF表——保存未着色的“普通”字形的表——因此看起来在不支持此格式时没有后备方案。它已经在FreeType中实现,FreeType在Android和Linux上使用,但OpenType的提案将把它带到Windows和苹果机器上。
来源: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
然而,在尝试一些示例字体后,我发现
这里,PHP不断抛出警告:
Warning: imagefttext(): Could not set character size
我担心
GD库不支持
FT_LOAD_COLOR标志。这个标志是必需的,以获得彩色表情符号。请参阅FreeType更改日志:
2013-05-23 Behdad Esfahbod
添加对颜色嵌入位图(例如彩色表情符号)的支持。
一个新的加载标志,FT_LOAD_COLOR,使FreeType加载颜色
嵌入位图,遵循此草案规范
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