note 50779 deleted from ref.image by tularis
| From: | tularis@php.net | Date: | Sun, 29 Jun 2008 21:09:12 +0000 |
| Subject: | note 50779 deleted from ref.image by tularis | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-140955@lists.php.net to get a copy of this message | ||
Note Submitter: andreaskalsch at gmx dot de
----
You get some trouble if you create an image by using the function imagettfbbox(). The x value is
correct but the y value doesn't consider that a text can have more than one line.
The second problem is to find the start position when you want to use imagettftext(), especially by
using an angle > 90°.
My solution uses some params to generate an image with any text. The image size is as small as
possible, but you can add a margin without problems:
params:
$text > the string you want to write
$format > output format "jpeg" or "png"
$quality > jpeg quality, from 1 to 100
$font > font path and file
$size > font size (px)
$angle > angle of text in degrees
$r > font color: red part
$g > font color: green part
$b > font color: blue part
$bgr > background color: red part
$bgg > bg color: green part
$bgb > bg color: blue part
$margin > a margin between text and border of pic
code:
<?
if ($text != '')
{
list(,,$w) = imagettfbbox($size, 0, $font, $text);
$lines = count(explode("\n", $text));
// get image size (not exactly)
$angle_rad = $angle / 180 * pi();
$h = 2 * $size * $lines;
$x = round($h * abs(sin($angle_rad)) + $w * abs(cos($angle_rad))) + $size;
$y = round($h * abs(cos($angle_rad)) + $w * abs(sin($angle_rad))) + $size;
// get start point for text
$run_y = - $lines * $size + 1.5 * $size;
$s_x = round($x / 2 - ($w / 2) * cos($angle_rad) + $run_y * sin($angle_rad));
$s_y = round($y / 2 + ($w / 2) * sin($angle_rad) + $run_y * cos($angle_rad));
// create image
$im = imagecreatetruecolor($x, $y);
@imageantialias($im, true);
$bg = imagecolorallocate ($im, $bgr, $bgg, $bgb);
$tx = imagecolorallocate ($im, $r, $g, $b);
#imagecolortransparent ($im, $bg);
imagefill($im, 0, 0, $bg);
// put text
imagettftext ($im, $size, $angle, $s_x, $s_y, $tx, $font, $text);
// minimize borders
// left
for ($x = 0; $x < imagesx($im); $x++)
{
for ($y = 0; $y < imagesy($im); $y++)
{
if (imagecolorat($im, $x, $y) != $bg) break(2);
}
}
$left = $x;
// right
for ($x = imagesx($im) - 1; $x >= 0; $x--)
{
for ($y = 0; $y < imagesy($im); $y++)
{
if (imagecolorat($im, $x, $y) != $bg) break(2);
}
}
$right = $x;
// top
for ($y = 0; $y < imagesy($im); $y++)
{
for ($x = 0; $x < imagesx($im); $x++)
{
if (imagecolorat($im, $x, $y) != $bg) break(2);
}
}
$top = $y;
// bottom
for ($y = imagesy($im) - 1; $y >= 0; $y--)
{
for ($x = 0; $x < imagesx($im); $x++)
{
if (imagecolorat($im, $x, $y) != $bg) break(2);
}
}
$bottom = $y;
// add margin
$cut = imagecreatetruecolor($right - $left + 1 + $margin * 2, $bottom - $top + 1 + $margin * 2);
$bg_ = imagecolorallocate ($cut, $bgr, $bgg, $bgb);
imagefill($cut, 0, 0, $bg_);
imagecopy ($cut, $im, $margin, $margin, $left, $top, $right - $left + 1, $bottom - $top + 1);
// output
if ($format == 'jpeg')
{
header("Content-type:image/jpeg");
imagejpeg($cut,false,$quality);
}
elseif ($format == 'png')
{
header("Content-type:image/png");
imagepng($cut);
}
}
?>
you can download an interface soon: http://aka-fotos.de/scripts.php