2015-09-04 151 views
4

我使用imagettftext函数写上图片文字写有表情的文字,但我的文字包含表情,并将其替换表情方盒子PHP函数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 

我与改变字体是“宋体的Unicode”,但它不是解决问题的尝试。

我该如何解决这个问题?

在此先感谢。

+0

您是否检查过您尝试使用的字体是否包含您尝试打印的unicode范围的字符? –

+0

是的Unicode字体支持字体,但不知道表情符号 –

+0

是否需要表情符号库或任何其他显示? –

回答

1

尝试使用带有已知emoji unicode字符的字体。像Symbola

+0

我试过这个,但不工作...取代表情符号? –

+0

你能提供你试图绘制的字符串吗? –

+0

我一直在测试Symbola,有些角色工作正常,像☕,但其他人不是真的。 我认为这只是一个试验和错误,以找到支持您需要的字体 –

1

你可以发布哪些笑脸是你想使用?如果你能给我们提供代码,你可以在选择笑脸后在windows charmap中看到,这将是最好的。 在Arial中,我发现只有这些笑脸:☺☻☼♀♂♠♠♣♦♦♪♫♯ - 他们都没有出现问题。我使用的例子,从php.net

+0

我从instagram获取数据,因此需要所有emojis的通用解决方案。你能提供给我的链接或例子,你尝试从php.net?你有没有试图在图像上显示这些笑脸? –

+0

我试过这个例子:http://php.net/manual/en/function.imagettftext.php,但从我看到我不能使用你发布的一些符号。我认为这是一个字体和/或编码相关的问题。 你的脚本是用utf-8编码的吗? PHP的默认编码设置为utf-8吗? – kayo

3

首先,我们需要了解如何表情符号来实现:

苹果的PNG图像(SBIX表)

苹果实现了它采用了专有的,未公开的扩展TrueType/OpenType规范将PNG图像添加到字体。这些PNG图像然后显示在正在运行的文本中。谷歌也实施了类似的事情,但它与苹果的解决方案不兼容。

Mozilla和Adobe的SVG(SVG表)。

这两个网络巨头为了最雄心勃勃的格式聚在一起:SVG在OpenType中。我们不是将Unicode字符映射到字形,而是将其映射到SVG图像。这为我们带来了所有可爱的SVG附加功能,包括渐变,嵌入式位图图像甚至动画。自从26版以来,它已经被Firefox支持!

微软COLR/CPAL

默认情况下,新的Segoe UI字体的表情符号的行为就像一个普通的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表示:http://apps.timwhitlock.info/emoji/tables/unicode

+0

我不想使用彩色的笑脸,但我可以显示笑脸,而不是空心方形? –

+0

@BhumiShah,我编辑了我的答案。在GD图书馆修复之前,这也是不可能的。 – stil

+0

使用imagick而不是gd函数可以获得表情符号吗? –

1

我建议你使用PHP ImageMagick库。尽管我没有使用表情符号来尝试它,但是当我尝试使用DG呈现文本时,遇到了与其他Unicode字符相同的问题。

顺便说一句,迁移到即时消息是个好主意,至少是因为更好的性能和更少的怪癖。

Here is an example that should work for You