Sybio / ImageWorkshop

ImageWorkshop is a PHP5.3+ library that helps you to manage images based on GD library
http://phpimageworkshop.com/
Other
862 stars 189 forks source link

Font Kerning #77

Open vicjalan opened 9 years ago

vicjalan commented 9 years ago

Hi,

I didn't see any option of adjusting letter spacing(font kerning). This is a great fun library to use and it's the one thing that is missing for the projects I am working on. Is there a workaround to this?

Thanks

jdecool commented 9 years ago

Hi @vicjalan,

Actually it's not possible to set letter spacing, because of GD limitation.

I just try to make a workaround and add a $spacing parameter to ImageWorkshopLayer::write function.

I just push a "feature/font-spacing" branch. If you want, feel free to give me a feedback.

vicjalan commented 9 years ago

Hi jdecool,

Thanks for looking into this. I downloaded the updated code from the "feature/font-spacing" branch. I tried adding a value for the $spacing parameter but no matter the value I just get a black box around the text but no spacing is applied.

The line of code looks like(where 5 should be the value for $spacing):

$powerLayer = ImageWorkshop::initTextLayer('POWER', 'Resources\fonts\berlin-sans-fb-demi-bold.ttf', 23, 'ffffff', 0, 5);

spacing

Thanks again!

vicjalan commented 9 years ago

Hi jdecool,

I understand what's happening now. The function initTextLayer doesn't have the $spacing parameter defined, the last parameter it has is $backgroundColor which is why the color was changing instead of adjusting the width.

I added the $spacing parameter to the initTextLayer function. However the dimensions of the text string is being looked up before the write function. So what this means is that the layer's width/height is being determined by the string length so when the letters are broken up and re-assembled with the spacing the text appears cut off.

I'm not sure if I'm explaining myself correctly but here is what I changed:

    public static function initTextLayer($text, $fontPath, $fontSize = 13, $fontColor = 'ffffff', $textRotation = 0, $backgroundColor = null, $spacing = 0)
    {
        $textDimensions = ImageWorkshopLib::getTextBoxDimension($fontSize, $textRotation, $fontPath, $text);

        $layer = static::initVirginLayer($textDimensions['width'], $textDimensions['height'], $backgroundColor);
        $layer->write($text, $fontPath, $fontSize, $fontColor, $textDimensions['left'], $textDimensions['top'], $textRotation, $spacing);

        return $layer;
    }

Also if I set any text rotation it looks like so spacing_rotation

jdecool commented 9 years ago

Thanks for your feedback.

I just try to write a quick POC.

I'm going to continue this feature next week.

mklahorst commented 6 years ago

Just checking in on this to see letter spacing is now part of latest build.