PHP GD Trim Прозрачные пиксели из созданного PNG - PullRequest
0 голосов
/ 15 августа 2010

В настоящее время я работаю над веб-сайтом и в последнее время использую GD с PHP для автоматического создания прозрачных изображений, которые состоят из текста для использования с навигацией, заголовками и т. Д. На веб-сайте. Это экономит мне много времени в Photoshop, и я могу мгновенно менять текст на кнопках, когда это необходимо.

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

Это код, с которым я сейчас работаю ...

<?
$text = strip_tags($_GET['btn']);
if(file_exists('nav_'.$text.'.png')) {
    header("Content-type: image/png");

    $image = imagecreatefrompng('nav_'.$text.'.png');
    imagesavealpha($image, true);
    imagealphablending($image, false);
    imagepng($image);
    imagedestroy($image);
} else {
    header("Content-type: image/png");

    $fontSize = 10;
    $angle = 0;
    $font = "RonniaBold.ttf";

    $size = imagettfbbox($fontSize, $angle, $font, $text);
    $image = imagecreatetruecolor(abs($size[2]) + abs($size[0]) + 5, abs($size[7]) + abs($size[1]) + 5);
    imagesavealpha($image, true);
    imagealphablending($image, false);

    $transparentColor = imagecolorallocatealpha($image, 200, 200, 200, 127);
    imagefill($image, 0, 0, $transparentColor);

    $textColor = imagecolorallocate($image, 125, 184, 222);
    imagettftext($image, $fontSize, 0, 1, abs($size[5])+1, $textColor, $font, str_replace('_',' ',strtoupper($text)));
    imagepng($image, 'nav_'.$text.'.png', 0);
    imagedestroy($image);
}
?>

Надеюсь, у вас, ребята, есть понимание этого, я действительно смогу это использовать!

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

У вас есть проблема с вашим кодом, из-за которой вы не можете определить правильный размер текста - при запросе размера текстового поля с помощью imagettfbox вы используете $ text:

$size = imagettfbbox($fontSize, $angle, $font, $text);

Но когда вынапишите текст на изображение, которое вы используете strtoupper ($ text) - что делает ваш текст больше (если вы не используете моноширинный шрифт).

2 голосов
/ 15 августа 2010

По возможности я использую класс Imagick , так как я предпочитаю библиотеку ImageMagick. Следующий пример взят почти дословно из примера, приведенного здесь . Создает изображение на основе размера предоставленного текста:

$text = 'Hello World!';

// Create a new ImageMagick objects.
$im = new Imagick();
$draw = new ImagickDraw();
$colour = new ImagickPixel('#000000');
$background = new ImagickPixel('none');

// Set font properties.
$draw->setFont('Fertigo_PRO.otf');
$draw->setFontSize(72);
$draw->setFillColor($colour);
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);

// Get font metrics.
$fm = $im->queryFontMetrics($draw, $text);

// Create text.
$draw->annotation(0, $fm['ascender'], $text);

// Create a new empty canvas, using the text size.
$im->newImage($fm['textWidth'], $fm['textHeight'], $background);

// Create the image.
$im->setImageFormat('png');
$im->drawImage($draw);

// Save the image.
$im->writeImage('test.png');

Если вам нужна дополнительная информация о классе Imagick, я рекомендую отличные статьи Imagick из Блог Микко .

...