我使用imagettftext函数在图像上写文字,但我的文字包含表情符号,它将表情符号替换为方框
这是我的代码:
$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"但它没有解决问题。
我该如何解决这个问题?
提前致谢。
答案 0 :(得分:4)
首先,我们需要了解如何实施表情符号:
Apple的PNG图像(SBIX表)
Apple使用专有的,未发布的TrueType / OpenType规范扩展来实现它,以将PNG图像添加到字体中。然后,这些PNG图像显示在运行文本中。 Google也实现了类似的功能,但它与Apple的解决方案不兼容。
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表 - 包含未着色的“普通”字形的表 - 所以看起来不支持不支持这种格式的后备。它已经在 FreeType 中实现,它在Android和Linux上使用,但OpenType的提议也会将其带到Windows和Apple机器上。
最后一种方法是我们感兴趣的。这是因为imagefttext
是由PHP GD扩展提供的功能。 GD内部使用FreeType库来绘制文本。
自2.5版以来FreeType支持Emojis。尝试执行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标志。这个标志需要有彩色的表情符号。请参阅FreeType更改日志:
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表示的Emojis表:http://apps.timwhitlock.info/emoji/tables/unicode
答案 1 :(得分:1)
尝试使用具有已知表情符号unicode字符的字体。像Symbola
一样答案 2 :(得分:1)
你能发布你想要使用的笑脸吗?最好是你可以在选择笑脸后给我们在windows charmap中看到的代码。 在Arial我发现只有这些笑脸:☺☻☼♀♂♠♣♥♦♪♫they - 他们都出现没有任何问题。我用过php.net的例子
答案 3 :(得分:1)
我建议您使用PHP ImageMagick库。虽然我没有尝试使用表情符号,但在尝试使用DG渲染文本时遇到了与其他Unicode字符相同的问题。
BTW迁移到IM是个好主意,至少是因为它具有更好的性能和更少的怪癖。
答案 4 :(得分:0)
这是我的建议:
使用此选项生成彩色漂亮的表情符号(选择输出.png) http://git.emojione.com/demos/latest/phpunicodetoimage.php#output
将imagettftext和Arial.ttf用于剩余文本
使用Imagick :: appendImages