Search code examples
phpgdimagettftext

PHP imagettftext partially bold


I'm training my PHP skills to generate images. I need only one thing which doesn't work. I don't think it's possible on the way I want, but there should be another way. The code I already have is this:

<?php
$textSize = 10;
$text = addslashes("Wietse: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed malesuada aliquet dolor, vitae tristique lectus imperdiet nec. Pellentesque et.");
$maxWidth = 448;

//Create image
$im = imagecreate(468, 60);

// Black background and White text
$bg = imagecolorallocate($im, 0, 0, 0);
$textColor = imagecolorallocate($im, 255, 255, 255);

// Split in multiple lines
$words = explode(' ', $text);
$lines = array();
$line = "";
foreach ($words as $word) {
    $box = imagettfbbox($textSize, 0, './arial.ttf', $line . $word);
    $width = $box[4] - $box[0];
    if($width > $maxWidth) {
        $line = trim($line);
        $line .= "\n";
    }
    $line .= $word . ' ';
}

// Write the text in the image
imagettftext($im, $textSize, 0, 10, $textSize + 10, $textColor, './arial.ttf', $line); // write text to image

// Output the image
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>

Which results in this image:

Image

It works fine, but my name, Wietse, should be Bold. I don't think it's possible to do this on a simple way, but it should be possible. I can add another imagettftext() with a Bold Arial font, but the Lorum ipsum text should start next to the name and the second line should continue on the same X coordinates as the name. Like it is now. I also have another wish, but I think it's too difficult because this text can have any position. But if someone knows how to do this he's great. This is that the link (http://www.google.com) has an underline. I don't think I need to tell further information.

Thanks on purpose!


Solution

  • I've found a solution myself to get the name in bold. I have no desire to explain everything because I am the one who asked this question, so I just give the new code with the resulting image. Tomorrow I'll try to give an underline to the link. If anyone knows the answer to that I'll accept that answer. Note that I've changed the code a little more which isn't necessary to get the code working.

    The code:

    <?php
    $username = 'WietsedeVries';
    $textSize = 10;
    $text = addslashes("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed malesuada aliquet dolor, vitae tristique http://www.google.com pellentesque et.");
    $maxWidth = 448;
    
    //Create image
    $im = imagecreate(468, 60);
    
    // Black background and White text
    $bg = imagecolorallocate($im, 0, 0, 0);
    $textColor = imagecolorallocate($im, 255, 255, 255);
    
    // Write Bold Username in image
    $usernameTotal = '@' . $username . ':';
    imagettftext($im, $textSize, 0, 10, $textSize + 10, $textColor, './arialbd.ttf', $usernameTotal);
    
    // Create white space with the width of the username
    $usernameBox = imagettfbbox($textSize, 0, './arialbd.ttf', $usernameTotal);
    $usernameWidth = $usernameBox[4] - $usernameBox[0];
    $whiteSpace = '';
    $whiteSpaceWidth = 0;
    while($whiteSpaceWidth < $usernameWidth) {
        $whiteSpace .= ' ';
        $whiteSpaceBox = imagettfbbox($textSize, 0, './arial.ttf', $whiteSpace);
        $whiteSpaceWidth = $whiteSpaceBox[4] - $whiteSpaceBox[0];
    }
    
    // Split in multiple lines
    $words = explode(' ', $text);
    array_unshift($words, $whiteSpace);
    $lines = array();
    $line = "";
    foreach ($words as $word) {
        $box = imagettfbbox($textSize, 0, './arial.ttf', $line . $word);
        $width = $box[4] - $box[0];
        if($width > $maxWidth) {
            $line = trim($line);
            $line .= "\n";
        }
        $line .= $word . ' ';
    }
    
    // Write the text in the image
    imagettftext($im, $textSize, 0, 10, $textSize + 10, $textColor, './arial.ttf', $whiteSpace . ' ' . $line);
    
    // Output the image
    header('Content-type: image/png');
    imagepng($im);
    imagedestroy($im);
    ?>
    

    This results in this image:

    Image