PHP GD - image damaged when using imagettftext()

89 Views Asked by At

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.

1

There are 1 best solutions below

0
Caroline Dirat On

I found the problem in my code :

The following line is wrong because of the last argument :

\imagecopymerge($card, $image, 0, 0, 0, 0, $width, $heigh, $quoteHeigh);

The correction is :

\imagecopymerge($card, $image, 0, 0, 0, 0, $width, $heigh, 100);
```