通过 GD 库函数使用自定义印地语字体时,图像上的叠加文本未正确渲染

问题描述 投票:0回答:1

我正在尝试使用 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);    
}

实际产量

预期产出

我已经尝试了herehere建议的解决方案,但当我使用指定的字体或其他印地文支持的字体时,它不起作用。

这似乎是 GD 库(使用 php 7.4)处理印地文字体的问题,如果能了解如何解决/支持这个问题,那就太好了。

php codeigniter gd
1个回答
0
投票

我必须使用 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"));
© www.soinside.com 2019 - 2024. All rights reserved.