PHP函数imagettftext()用smileys写文本

时间:2015-09-04 05:56:10

标签: php emoji imagettftext

我使用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"但它没有解决问题。

我该如何解决这个问题?

提前致谢。

5 个答案:

答案 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机器上。

           

来源:12

最后一种方法是我们感兴趣的。这是因为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是个好主意,至少是因为它具有更好的性能和更少的怪癖。

Here is an example that should work for You

答案 4 :(得分:0)

这是我的建议:

  1. 使用此选项生成彩色漂亮的表情符号(选择输出.png) http://git.emojione.com/demos/latest/phpunicodetoimage.php#output

  2. 将imagettftext和Arial.ttf用于剩余文本

  3. 使用Imagick :: appendImages

  4. 附加所有.png