php gd Выравнивание текста по центру изображения

Общая идея

Общая идея для центрирования по вертикали и горизонтали:

/ Get image dimensions
  $width = imagesx($image);
  $height = imagesy($image);
// Get center coordinates of image
  $centerX = $width / 2;
  $centerY = $height / 2;
// Get size of text
  list($left, $bottom, $right, , , $top) = imageftbbox($font_size, $angle, $font, $text);
// Determine offset of text
  $left_offset = ($right - $left) / 2;
  $top_offset = ($bottom - $top) / 2;
// Generate coordinates
  $x = $centerX - $left_offset;
  $y = $centerY + $top_offset;
// Add text to image
  imagettftext($image, $font_size, $angle, $x, $y, $color, $font, $text);

-- отсюда

Центрируем по горизонтали - функция

  /**
   * Высчитает горизонтальное смещение для текста, при выравнивании по центру изображения
   */
  protected function getCentredOffsetX(int $font_size, string $font, string $text): int {
    $width = imagesx($this->image); //  получаем GdImage/resource любым способом
    $imageСenter = $width / 2;
    $angle = 0; // ноль, если не наклоняем строки
    [$left, , $right] = imageftbbox($font_size, $angle, $font, self::someConvertEncoding($text));
    $textAreaMiddle  = ($right - $left) / 2;
    return  round($imageСenter - $textAreaMiddle);
  }

-в примере выше мы используем свою функцию self::someConvertEncoding() для преобразования из одной кодировки в другую (вам может не потребоваться!), т.к. важно передать строку в imageftbbox() в той кодировке, в которой вы передаете ее затем на отрисовку (напр в imagettftext() - иначе размеры области теста будут вычислены функцией выше неправильно и, как следтсвие, "поедет" центр.

Key Words for FKN + antitotal forum (CS VSU):