Плохое качество шрифта в коде php (imagettftext)

#php #webfonts #imagettftext

#php #webfonts #imagettftext

Вопрос:

Не удается решить эту проблему даже после долгого времени работы с Google и многими способами, но все равно безуспешно.

Качество шрифта в файле .php очень низкое, скачал один и тот же шрифт с разных сайтов — не повезло (все еще в плохом качестве), скачал даже случайный шрифт из Google fonts (подумал, что, возможно, мой загруженный шрифт сломан по неизвестным причинам) — по-прежнему не повезло.

Понятия не имею, как решить эту проблему и сделать ее в надлежащем качестве для вывода на изображение.

Код формы:

 <div class="s box hide" id="div3">
                   
                    <label></label> <input type="text" style="text-transform: uppercase;"   placeholder="Iki 6 skaitmenų" pattern="[A-Za-z0-9] "  class="form-control" name="txt_input_" maxlength="6" >
                </div>
                <br>
        <label><input type="radio" name="check" onclick="show3();" value="s">Individual</label>
        </div>
<div class="button-row">
            <input type="submit" id="submit" name="submit" class="btn btn-info" value="Generate">
        </div>
  

Основной код функции php (который генерирует все):

 if (isset($_POST['submit'])) {
    
    
    $check = $_POST['check'];
    
    
    if($check == 's'){
        
    $txt_input_ = $_POST['txt_input_'];
     $countNumber = strlen($txt_input_);
    $txt_input_ = strtoupper($txt_input_);
    $num_input = $_POST['num_input'];
    $width = 680;
    $height = 240;
    
    $textImage = imagecreate($width, $height);
    $grey = imagecolorallocate($textImage, 100, 100, 100);
    $white = imagecolorallocate($textImage, 255, 255, 255);
    imagecolortransparent($textImage, 0);
    $color = imagecolorallocate($textImage, 0, 0, 0);
   
    
    
    // create background image layer
    $background = imagecreatefromjpeg('http://sample-domain.com/greyspace.jpg');
    $font = "Roboto-Bold.ttf"; 

    //imagestring($textImage, 5, 110, 20, $input_text, 0xFFFFFF);
    
    if($countNumber ==1){
    imagettftext($textImage, 60, 0, 200, 83, $color, $font, $txt_input_);
    }
    
    if($countNumber ==2){
    imagettftext($textImage, 60, 0, 180, 83, $color, $font, $txt_input_);
    }
    if($countNumber ==3){
    imagettftext($textImage, 60, 0, 155, 83, $color, $font, $txt_input_);
    }
    if($countNumber ==4){
    imagettftext($textImage, 60, 0, 135, 83, $color, $font, $txt_input_);
    }
    if($countNumber ==5){
    imagettftext($textImage, 60, 0, 125, 83, $color, $font, $txt_input_);
    }
    
    if($countNumber ==6){
    imagettftext($textImage, 60, 0, 105, 83, $color, $font, $txt_input_);
    }
    

    // Merge background image and text image layers
   imagecopymerge($background, $textImage, 0, 0, 0, 0, $width, $height, 99);
    
    $width = 680;
    $height = 240;
    $output = imagecreatetruecolor($width, $height);
    imagecopy($output, $background, 0, 0, 0, 0, $width, $height);
    
    
    ob_start();

    imagejpeg($output);
    printf('<img id="output" src="data:image/jpeg;base64,%s" />', base64_encode(ob_get_clean()));
         ob_start();
     imagejpeg($output);
     
     printf('<br><br><a id="" href="data:image/jpeg;base64,%s" download><input type="button" value="Download"></a>', base64_encode(ob_get_clean()));
     
    }
  

В основном результате мое качество шрифта в сгенерированном формате jpeg (пробовал с png либо — все то же качество):

введите описание изображения здесь

На изображении края символов настолько четкие и похожи на пиксели, что, очевидно, они не в лучшем состоянии. Любые предложения, как избавиться от этой головной боли? Заранее спасибо!

Ответ №1:

Способ исправить это должным образом — использовать изображение с правильным цветом фона, даже если этот цвет фона прозрачный. Это заставляет библиотеку изображений использовать правильный альфа-канал (что является единственным разумным способом выполнения альфа-смешивания), а не использовать альфа-формат на основе индекса, где только один «цвет» прозрачен, а все остальные полностью непрозрачны.