Я пытаюсь правильно визуализировать текст в прозрачном изображении (я добавлю это сгенерированное изображение в другое изображение). Проблема в том, что PHP и альфа-прозрачность ведут себя странно, когда дело доходит до узкого шрифта.
Вот код, используемый:
(с помощью https://github.com/stil/gd-text библиотека для рендеринга текста)
<?php
require_once (dirname(__FILE__).'/vendor/autoload.php');
class TextImage
{
protected $text;
protected $width;
protected $height;
protected $font;
protected $colorR;
protected $colorG;
protected $colorB;
protected $size;
/**
*
* @param int $width Image width
* @param int $height Image height
* @param string $font Font path
*/
public function __construct($text=null, $width=null, $height=null, $font=null, $colorR=null, $colorG=null, $colorB=null, $size=null)
{
$this->width = $width;
$this->height = $height;
$this->font = $font;
$this->colorR = $colorR;
$this->colorG = $colorG;
$this->colorB = $colorB;
$this->size = $size;
$this->text = $text;
}
public function render()
{
// create image for the given width/height
$image = imagecreatetruecolor($this->width, $this->height);
// apply transparence
imagealphablending($image, false);
imagesavealpha($image, true);
$transparent = imagecolorallocatealpha($image, 0,0,0, 127);
imagefill($image, 0, 0, $transparent);
// now use GDText to add the text
$box = new \GDText\Box($image);
$box->setFontFace($this->font);
$box->setFontColor([$this->colorR, $this->colorG, $this->colorB]);
//$box->setTextShadow([0, 0, 0, 50], 2, 2);
$box->setFontSize($this->size);
//$box->setLeading(0.8);
$box->setBox(0, 0, $this->width, $this->height);
$box->setTextAlign('center', 'center');
$box->draw($this->text);
// output
header("Content-type: image/png");
imagepng($image);
}
}
Вот тестовый пример:
$test = new TextImage('Exemple', 200, 30, 'Exmouth.ttf', 0, 0, 0, 20);
$test->render();
Я использую этот шрифт: http://www.dafont.com/exmouth.font
Вот отрендеренное изображение:
Видите, как текст нарушен? И это не всегда так. Вот еще один пример с другим текстом:
И если я не делаю прозрачность, то это выглядит хорошо. Может мне стоит перейти на другое решение для рендеринга прозрачного текста?
Примечание: если я изменю шрифт & размер изображения Это ничего не меняет с проблемой прозрачности.
Проблема вызвана линией imagealphablending($image, false);
, Удаление этого приводит к правильному отображению текста. Это по-прежнему создает изображение с неповрежденными данными альфа-канала, поэтому я ожидаю, что вы сможете использовать его для последующего слияния.
Что касается того, почему это происходит … Я понятия не имею. Я не могу воспроизвести проблему с другим шрифтом. Мое лучшее предположение состоит в том, что шрифт почему-то не очень хорошо работает с GD, либо из-за ошибки в GD, либо из-за проблемы в том, как разработан шрифт.
Других решений пока нет …