2014-03-06 3 views
1

Моя цель - нарисовать горизонтально центрированный m. Поэтому я рассчитываю ширину буквы, вычитаю это значение из общей ширины и, наконец, делим на 2. Результатом должно быть расстояние слева (или одинаково справа).Не может быть расположен в горизонтальном положении 'm' с GD2

Однако «m» всегда неуместен. Я также заметил, что некоторые шрифты не могут вызвать проблемное поведение. Обратите внимание, что мой скрипт корректно работает для всех других латинских символов.

Arial:

Misplaced 'm'; font: Arial

Bitstream Vera Sans:

Misplaced 'm'; font: Bitstream Vera Sans

<?php 

$totalWidth = 100; 
$totalHeight = 100; 
$font = 'Arial.ttf'; 

$img = imagecreatetruecolor($totalWidth, $totalHeight); 
$red = imagecolorallocate($img, 255, 0, 0); 

$fontSize = 100; 
$bbox = imagettfbbox($fontSize, 0, $font, 'm'); 
$width = max($bbox[2], $bbox[4]) - max($bbox[0], $bbox[6]); 

$centeredX = ($totalWidth - $width)/2; 

imagettftext($img, 100, 0, $centeredX, 100, $red, $font, 'm'); 
imagepng($img, 'testcase.png'); 
imagedestroy($img); 

ответ

2

Существует небольшое пространство слева от каждой буквы, и это отличается каждая буква. Кто-то на PHP.net написал решение для этого: http://www.php.net/manual/en/function.imagettfbbox.php#97357

Вам нужно немного настроить свой код.

$totalWidth = 100; 
$totalHeight = 100; 
$font = 'Arial.ttf'; 

// change letter to see it with different letters 
$letter = "m"; 

$img = imagecreatetruecolor($totalWidth, $totalHeight); 
$red = imagecolorallocate($img, 255, 0, 0); 

$fontSize = 100; 
$bbox = calculateTextBox($fontSize, 0, $font, $letter); 

$centeredX = (($totalWidth - $bbox['width'])/2); 

// here left coordinate is subtracted (+ negative value) from centeredX 
imagettftext($img, 100, 0, $centeredX + $bbox['left'], 100, $red, $font, $letter); 

header('Content-Type: image/png'); 
imagepng($img); 
imagedestroy($img); 
+0

Отличный ответ! Большое спасибо! Мне также удалось центрировать его по вертикали: '$ centeredY = (($ totalHeight - $ bbox ['height'])/2);' и '$ centeredY + $ bbox ['top']' как параметр Y для 'imagettftext() '. – ComFreek

Смежные вопросы