我正在尝试使用 php 中的 GD 库向图像添加覆盖文本,虽然它非常适合英语字符,但当文本为印地语时,即使使用的字体支持印地语文本,我也会遇到渲染问题。使用字体对图像进行转换和渲染后,结果不符合预期。
我正在使用从这里下载的字体RozhaOne
这是我正在执行的代码
function createImageWithText()
{
$image = imagecreatefromjpeg($this->asset_url.'/images/input.jpeg');
$fontSize = 32;
list($r, $g, $b) = sscanf("#00bfff", "#%02x%02x%02x");
$fontColor = imagecolorallocate($image, $r, $g, $b);
$font = $this->asset_url.'/fonts/RozhaOne-Regular.ttf';
$text = "कृति";
imagettftext(
$image,
$fontSize,
0,
500,
500,
$fontColor,
$font,
$text
);
$save_path = $this->asset_url.'/images/output.png';
imagepng($image, $save_path);
imagedestroy($image);
}
我已经尝试了here和here建议的解决方案,但当我使用指定的字体或其他印地文支持的字体时,它不起作用。
这似乎是 GD 库(使用 php 7.4)处理印地文字体的问题,如果能了解如何解决/支持这个问题,那就太好了。
我必须使用 mPDF 库来实现此目的,因为它对所有类型的脚本和语言都有广泛支持,请参阅 OTL 支持页面 here 了解您选择的字体配置。以下是正确将字体呈现为图像上的叠加层的代码。首先创建一个 pdf,然后将其转换为图像。
$html =
'
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
.imageContainer {
z-index: 1;
position: absolute;
top: 0;
left: 0;
}
.textContainer{
z-index: 2;
width: 100%;
height: 100%;
position: absolute;
top: 120px;
left: 50px;
color: blue;
font-family: "Rozha One";
font-size: 24px;
text-align: center;
}
</style>
</head>
<body>
<div class="imageContainer">
<img src="' .
storage_path("input.jpeg") .
'">
</div>
<div class="textContainer">
कृति
</div>
</body>
</html>
';
$fontDir = storage_path("app/fonts/");
$defaultConfig = (new \Mpdf\Config\ConfigVariables())->getDefaults();
$fontDirs = $defaultConfig["fontDir"];
$defaultFontConfig = (new \Mpdf\Config\FontVariables())->getDefaults();
$fontData = $defaultFontConfig["fontdata"];
$mpdf = new \Mpdf\Mpdf([
"fontDir" => array_merge($fontDirs, [$fontDir]),
"fontdata" => $fontData + [
"rozhaone" => [
"R" => "RozhaOne-Regular.ttf",
"useOTL" => 0x80
]
]
]);
$mpdf->WriteHTML($html);
$filePath = storage_path("output.pdf");
$mpdf->Output($filePath, \Mpdf\Output\Destination::FILE);
$imagick = new Imagick();
$imagick->readImage(storage_path("output.pdf") . "[0]");
$imagick->setImageFormat("png");
$imagick->writeImage(storage_path("output.jpg"));