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