合并图像时会破坏Unicode字体&使用php的文本

时间:2016-02-20 06:47:22

标签: php unicode

我尝试将文字与图片合并,但合并后我的文字无法正确呈现。

查看我的截图: render problem

红色标记(আমিতোমায়য়ালবাসি)文本格式正常,而我通常会显示变量。字体链接:http://www.fonts2u.com/solaimanlipi.font

但是,当我将文本与图像合并时,它的损坏或无法正确渲染。

这是我的完整代码:

<?php
mb_language('uni');
mb_internal_encoding('UTF-8');
$username="";
if(isset($_POST['user'])){
    $username = $_POST['user'];
    $username = mb_convert_encoding($username, 'HTML-ENTITIES',"UTF-8");
    $username = html_entity_decode($username,ENT_NOQUOTES, "ISO-8859-1");
}

$im = imagecreatefromjpeg('image.jpg');
//The numbers are the RGB values of the color you want to use 
$black = ImageColorAllocate($im, 255, 255, 255); 

//The canvas's (0,0) position is the upper left corner 
//So this is how far down and to the right the text should start 
$start_x = 50; 
$start_y = 80; 

$font = 'SolaimanLipi.ttf';

Imagettftext($im, 50, 0, $start_x, $start_y, $black, $font, "$username"); 

//Creates the jpeg image and sends it to the browser 
//100 is the jpeg quality percentage 

Imagejpeg($im, 'result.jpg', 100); 

echo "<div style='color:red;font-size:60px;'>".$username."</font><br /><img src='result.jpg' height='500' />"
?>

注1: SolaimanLipi.ttf是Bangla(Unicode)字体。
注2: Bangla (Unicode) font not rendering correctly in tcpdf此Stack&amp;堆栈解决方案将帮助您了解我的问题&amp;给我一个解决方案。

有人帮我解决这个问题。提前谢谢。

[[以前我问了同样的问题,没有人回答。所以我重新发布并删除旧的。我希望这次有人帮助我。]]

1 个答案:

答案 0 :(得分:2)

孟加拉语是众多脚本中的一个,无法通过在下一个字符之后放置一个字符来呈现。字符的形状根据其邻居而改变和合并。

要正确渲染,您需要一组称为Complex Text Layout的功能。在不支持CTL的文本呈现系统上,您将获得与单独呈现的每个字母相同的内容,因此আমি会像আ ম ি一样出现。

PHP imagettftext函数使用的GD库不支持复杂文本布局。您必须使用某些更高级别的渲染库,例如Pango。这有点痛苦;如果你可以通过在图像上渲染文本作为HTML / CSS / SVG的一部分来实现你的目标,那肯定会更容易。

(BTW将$username写入HTML而不进行htmlspecialchars()是一个XSS安全漏洞,写入然后提供JPEG文件是不安全的,因为如果两个请求进入,它将会中断同时。您还应该通过添加<meta charset="utf-8"/>将您的页面/表单作为UTF-8提供,这样您就不必与mb_convert_encoding / html_entity_decode进行疯狂的舞蹈。< / p>