I'am using PHP 7.4, with Symfony 5.2, memory_limit = 1024M in php.ini
I implement an API which put a quote in an image, using imagettftext() method.
My problem is that the image is damaged. It seems to be because of the length of the text.
When the text is short, the result is ok: image ok When the text is longer, the image is damaged (color spots appear): image damaged
Here is my code:
private function createResource(string $imageContent, array $quote)
{
$image = \imagecreatefromstring($imageContent);
$heigh = \imagesy($image);
$width = \imagesx($image);
$text = $quote['quote'];
$charsArray = \str_split($text, 1);
$charsTotalNb = \count($charsArray);
$charsNbPerLine = (int) floor(($width - 50) / 10);
$lineNb = (int) ceil($charsTotalNb / $charsNbPerLine);
$text = \wordwrap($text, $charsNbPerLine, "|", \false);
$quoteHeigh = 60 + $lineNb * 25;
$card = \imagecreatetruecolor($width, $heigh + $quoteHeigh);
$black = \imagecolorallocate($card, 0, 0, 0);
$white = imagecolorallocate($card, 255, 255, 255);
\imagefill($card, 0, 0, $black);
\imagecopymerge($card, $image, 0, 0, 0, 0, $width, $heigh, $quoteHeigh);
\imagedestroy($image);
$font = __DIR__ . '/../../public/fonts/Averia_Serif_Libre.ttf';
\imagettftext($card, 15, 0, 25, $heigh + 30, $white, $font, $text);
$author = $quote['author'];
if (empty($author)) {
$author = 'Anonymous';
}
\imagettftext(
$card,
12,
0,
(int) $width/2,
$heigh + 40 + $lineNb * 25,
$white,
$font,
'-' . $author . '-'
);
for ($i = 0 ; $i < 7 ; $i++ ) {
\imageline($card, 0 + $i, 0 + $i, 0 + $i , \imagesy($card), $black);
\imageline($card, 0, 0 + $i, \imagesx($card) , 0 + $i, $black);
\imageline($card, \imagesx($card) - $i, 0, \imagesx($card) - $i, \imagesy($card), $black);
}
if (empty(\get_resource_type($card))) {
throw new Exception("Error Processing Request in CardService::createCard()");
}
return $card;
}
How fix my problem ? How to remedy the deterioration of the cat's image?
Thanks for your answers.
I found the problem in my code :
The following line is wrong because of the last argument :
The correction is :