Can't Change Font Size for Gd Imagestring()

Can't change font size for GD imagestring()

You can't put 100 - http://php.net/manual/en/function.imagestring.php

Only 1-5 (by default)

UPDATE

To be able fully control the font size you might want to use http://php.net/manual/en/function.imagettftext.php

Example (from the same site):

<?php
// Set the content-type
header('Content-Type: image/png');

// Create the image
$im = imagecreatetruecolor(400, 30);

// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 399, 29, $white);

// The text to draw
$text = 'Testing...';
// Replace path by your own font path
$font = 'arial.ttf';

// Add some shadow to the text
imagettftext($im, 20, 0, 11, 21, $grey, $font, $text);

// Add the text
imagettftext($im, 20, 0, 10, 20, $black, $font, $text);

// Using imagepng() results in clearer text compared with imagejpeg()
imagepng($im);
imagedestroy($im);
?>

Write text on the image in proportion

Since it seems to be pretty difficult to determine if text is wider than its bounding box without being able to actually "see" it, this is the solution I came up with.

I used a 1000px wide image and resized it to 600. Of course you evidently have all of this worked out already.

I'm not all that great at writing answers (although the code has been tested and does work) so I hope this helps.

<?php
$FormAction = $_SERVER['PHP_SELF'];

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { // if form is submitted

// get original image
$fileName = $_FILES["ImageName"]["name"]; // The file name
$fileTempLoc = $_FILES["ImageName"]["tmp_name"]; // File in the PHP tmp folder
$type = strtolower(substr(strrchr($fileName,"."),1));
if($type == 'jpeg') { $type = 'jpg'; }

// Temporary upload image name
$original_image = $_FILES['ImageName']['tmp_name'];

// Name to save the image as - in this case the same as the original
$new_image = $_FILES['ImageName']['name'];

// Get the image dimensions
$uploaded_size = getimagesize($original_image);
$uploaded_imgw = $uploaded_size[0];
$uploaded_imgh = $uploaded_size[1];

// Maximum image width and height
$max_width = "600";
$max_height = "600";

// Thumbnail image width and height
$thumbnail_max_width = "100";
$thumbnail_max_height = "100";

// Check to see if we need to resize the image
if ($uploaded_imgw > 600 || $uploaded_imgh > 600) { // if image is larger than 600x600
// Resize image using GD2 cmd
// Get new dimensions
list($width_orig, $height_orig) = getimagesize($original_image);
$ratio_orig = $width_orig/$height_orig;
// resize our image proportionately maintaining its original aspect
if ($thumbnail_max_width/$thumbnail_max_height > $ratio_orig) {
$width = $max_width*$ratio_orig; //576
$height = $max_height;
} else {
$height = $max_height/$ratio_orig; // 576
$width = $max_width; //600
}
// Resample / Resize the image
$orig_image_p = imagecreatetruecolor($width, $height);

if($type == "gif" || $type == "png"){
imagecolortransparent($orig_image_p, imagecolorallocate($orig_image_p, 0, 0, 0));
}
if($type == "jpg") {
$temp_image = imagecreatefromjpeg($original_image);
}
if($type == "gif") {
$temp_image = imagecreatefromgif($original_image);
}
if($type == "png") {
$temp_image = imagecreatefrompng($original_image);
}

imagecopyresampled($orig_image_p, $temp_image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

if($type == "jpg") {
imagejpeg($orig_image_p, $original_image, 80);
}
if($type == "gif") {
imagegif($orig_image_p, $original_image);
}
if($type == "png") {
imagepng($orig_image_p, $original_image, 9);
}
move_uploaded_file($original_image, '../../Images/'.$new_image);
imagedestroy($temp_image);
imagedestroy($orig_image_p);
} else { // if image is smaller than 900x900
$small_image_p = imagecreatetruecolor($uploaded_imgw, $uploaded_imgh);

if($type == "gif" || $type == "png"){
imagecolortransparent($small_image_p, imagecolorallocate($small_image_p, 0, 0, 0));
}

if($type == "jpg") {
$small_temp_image = imagecreatefromjpeg($original_image);
}
if($type == "gif") {
$small_temp_image = imagecreatefromgif($original_image);
}
if($type == "png") {
$small_temp_image = imagecreatefrompng($original_image);
}

imagecopyresampled($small_image_p, $small_temp_image, 0, 0, 0, 0, $uploaded_imgw, $uploaded_imgh, $uploaded_imgw, $uploaded_imgh);

if($type == "jpg") {
imagejpeg($small_image_p, $original_image, 80);
}
if($type == "gif") {
imagegif($small_image_p, $original_image);
}
if($type == "png") {
imagepng($small_image_p, $original_image, 9);
}
move_uploaded_file($original_image, '../../Images/'.$new_image);
imagedestroy($small_temp_image);
imagedestroy($small_image_p);
} // end if smaller than 600x600

// Get the image we will work with
$new_img_src = '../../Images/'.$new_image;
list($new_width, $new_height) = getimagesize($new_img_src);

if($type == 'jpg') {
$im = imagecreatefromjpeg($new_img_src);
}
if($type == 'png') {
$im = imagecreatefrompng($new_img_src);
}
if($type == 'gif') {
$im = imagecreatefromgif($new_img_src);
}

// Create a blank canvas for our new image
$new_image_p = imagecreatetruecolor($new_width, $new_height);

if($type == "gif" || $type == "png"){
imagecolortransparent($new_image_p, imagecolorallocate($new_image_p, 0, 0, 0));
}
if($type == 'jpg') {
$new_temp_image = imagecreatefromjpeg($new_img_src);
}
if($type == 'png') {
$new_temp_image = imagecreatefrompng($new_img_src);
}
if($type == 'gif') {
$new_temp_image = imagecreatefromgif($new_img_src);
}

imagecopyresampled($new_image_p, $new_temp_image, 0, 0, 0, 0, $new_width, $new_height, $new_width, $new_height);

// set dimensions for our canvas
$adj_width = $new_width+40;
$adj_height = $new_height+120;

$bkgrd = imagecreatetruecolor($adj_width, $adj_height);
imagefilledrectangle($bkgrd, 0, 0, $adj_width, $adj_height, 0x000000);
$sx = imagesx($bkgrd)-imagesx($bkgrd)+20;
$sy = imagesy($bkgrd)-imagesy($bkgrd)+20;

// Place our original image on the canvas centered and 20px from the top
imagecopymerge($bkgrd, $new_image_p, $sx, $sy, 0, 0, imagesx($bkgrd), imagesy($bkgrd), 100);

// Save the image to file and free memory
if($type == "jpg") {
imagejpeg($bkgrd, $new_img_src, 80);
}
if($type == "gif") {
imagegif($bkgrd, $new_img_src);
}
if($type == "png") {
imagepng($bkgrd, $new_img_src, 9);
}
imagedestroy($im);
imagedestroy($new_image_p);
imagedestroy($bkgrd);

//Now we create our text as images to be merged with our new image

// check width of bounding box
function calculateTextBox($text,$fontFile,$fontSize,$fontAngle) {
/************
simple function that calculates the *exact* bounding box (single pixel precision).
The function returns an associative array with these keys:
left, top: coordinates you will pass to imagettftext
width, height: dimension of the image you have to create
*************/
$rect = imagettfbbox($fontSize,$fontAngle,$fontFile,$text);
$minX = min(array($rect[0],$rect[2],$rect[4],$rect[6]));
$maxX = max(array($rect[0],$rect[2],$rect[4],$rect[6]));
$minY = min(array($rect[1],$rect[3],$rect[5],$rect[7]));
$maxY = max(array($rect[1],$rect[3],$rect[5],$rect[7]));

return array(
"left" => abs($minX) - 1,
"top" => abs($minY) - 1,
"width" => $maxX - $minX,
"height" => $maxY - $minY,
"box" => $rect
);
}

$text_string = $_POST['TopLine']; //"This is a very long first line to see what happens if it is too long";
$font_ttf = "arial.ttf";
$font_size = 22;
$text_angle = 0;
$text_padding = 10; // Img padding - around text

$the_box = calculateTextBox($text_string, $font_ttf, $font_size, $text_angle);

$imgWidth = $the_box["width"] + $text_padding;
$imgHeight = $the_box["height"] + $text_padding;

$image = imagecreatetruecolor($imgWidth,$imgHeight);
imagefill($image, imagecolorallocate($image, 0, 0, 0));

$color = imagecolorallocate($image, 255, 255, 255);

imagettftext($image,
$font_size,
$text_angle,
$the_box["left"] + ($imgWidth / 2) - ($the_box["width"] / 2),
$the_box["top"] + ($imgHeight / 2) - ($the_box["height"] / 2),
$color,
$font_ttf,
$text_string);

// save file
imagepng($image, '../../Images/NewTopImg.png', 9);

// destroy the image and start over
imagedestroy($image);

$text_string = $_POST['BottomLine']; //"This is a very long second line to see what happens if it is too long. Even a longer line than the first one.";
$font_ttf = "arial.ttf";
$font_size = 16;
$text_angle = 0;
$text_padding = 10; // Img padding - around text

$the_box = calculateTextBox($text_string, $font_ttf, $font_size, $text_angle);

$imgWidth = $the_box["width"] + $text_padding;
$imgHeight = $the_box["height"] + $text_padding;

$image = imagecreatetruecolor($imgWidth,$imgHeight);
imagefill($image, imagecolorallocate($image, 0, 0, 0));

$color = imagecolorallocate($image, 255, 255, 255);

imagettftext($image,
$font_size,
$text_angle,
$the_box["left"] + ($imgWidth / 2) - ($the_box["width"] / 2),
$the_box["top"] + ($imgHeight / 2) - ($the_box["height"] / 2),
$color,
$font_ttf,
$text_string);

// save file
imagepng($image, '../../Images/NewBottomImg.png', 9);

imagedestroy($image);

// Now merge the three images together
//function merge($filename_x, $filename_y, $filename_result) {

// Get dimensions for specified images
$filename_vs = '../../Images/'.$new_image;
$filename_x = '../../Images/NewTopImg.png';
$filename_y = '../../Images/NewBottomImg.png';
list($width_x, $height_x) = getimagesize($filename_x);
list($width_y, $height_y) = getimagesize($filename_y);
list($width_vs, $height_vs) = getimagesize($filename_vs);

// before we go any farther lets find out if our text is wider than our image
if($width_x > $new_width) { // if it is too wide lets resize it
// create smaller image using GD2 cmd to the smallest side
$line1_img_src = '../../Images/NewTopImg.png';
$line1_img_path = '../../Images/NewTopImg.png';
list($src_width, $src_height) = getimagesize($line1_img_src);

$min = $new_width; // set our max width to that of the original image
$ratio = $src_height/$src_width;
$line1_width = $min;
$Line1_height = round($min * $ratio);

$blank_image_line1 = imagecreatetruecolor($line1_width, $Line1_height);

imagecolortransparent($blank_image_line1, imagecolorallocate($blank_image_line1, 0, 0, 0));

$image = imagecreatefrompng($line1_img_src);

imagecopyresampled($blank_image_line1, $image, 0, 0, 0, 0, $line1_width, $Line1_height, $src_width, $src_height);

imagepng($blank_image_line1, $line1_img_path, 9);

imagedestroy($blank_image_line1);
imagedestroy($image);

// Because we resized the first line we need to get the new dimensions
$filename_x = '../../Images/NewTopImg.png';
list($width_x, $height_x) = getimagesize($filename_x);
// End resize first line
}

// Now lets check line two
if($width_y > $new_width) { // if it is too wide lets resize it
// create smaller image using GD2 cmd to the smallest side
$line2_img_src = '../../Images/NewBottomImg.png';
$line2_img_path = '../../Images/NewBottomImg.png';
list($src_width, $src_height) = getimagesize($line2_img_src);

$min = $new_width; // set our max width to that of the original image
$ratio = $src_height/$src_width;
$line2_width = $min;
$line2_height = round($min * $ratio);

$blank_image_line2 = imagecreatetruecolor($line2_width, $line2_height);

imagecolortransparent($blank_image_line2, imagecolorallocate($blank_image_line2, 0, 0, 0));

$image = imagecreatefrompng($line2_img_src);

imagecopyresampled($blank_image_line2, $image, 0, 0, 0, 0, $line2_width, $line2_height, $src_width, $src_height);

imagepng($blank_image_line2, $line2_img_path, 9);

imagedestroy($blank_image_line2);
imagedestroy($image);

// Because we resized the second line we need to get the new dimensions
$filename_y = '../../Images/NewBottomImg.png';
list($width_y, $height_y) = getimagesize($filename_y);
// End resize second line
}

// Create new image with desired dimensions
$image = imagecreatetruecolor($width_vs, $height_vs);

// Load images and then copy to destination image
if($type == "gif" || $type == "png"){
imagecolortransparent($image, imagecolorallocate($image, 0, 0, 0));
}
if($type == 'jpg') {
$image_vs = imagecreatefromjpeg($filename_vs);
}
if($type == 'png') {
$image_vs = imagecreatefrompng($filename_vs);
}
if($type == 'gif') {
$image_vs = imagecreatefromgif($filename_vs);
}
$image_x = imagecreatefrompng($filename_x);
$image_y = imagecreatefrompng($filename_y);

//set location for merged images
$vs_x = imagesx($image); // width of our completed image
$vs_y = imagesy($image);// height of our completed image
$x_x = $width_x; // width of the top line
$x_x = ($vs_x/2)-($x_x/2);
$x_y = $new_height+30; // height of the original img + 20px we dropped it from the top of the canvas + 10px more for spacing below our "picture" placed on the canvas
$y_x = $width_y; // width of the bottom line
$y_x = ($vs_x/2)-($y_x/2);
$y_y = $new_height+70; // height of the original img + 20px we dropped it from the top of the canvas + 40px more for spacing below the first line of text

imagecopy($image, $image_vs, 0, 0, 0, 0, $width_vs, $height_vs);
imagecopy($image, $image_x, $x_x, $x_y, 0, 0, $width_vs, $height_vs);
imagecopy($image, $image_y, $y_x, $y_y, 0, 0, $width_vs, $height_vs);

// set dimensions for our canvas
$adj_width = $new_width+40;
$adj_height = $new_height+120;

$bkgrd = imagecreatetruecolor($adj_width, $adj_height);
imagefilledrectangle($bkgrd, 0, 0, $adj_width, $adj_height, 0x000000);
$sx = imagesx($bkgrd)-imagesx($bkgrd)+20;
$sy = imagesy($bkgrd)-imagesy($bkgrd)+20;

// Place our original image on the canvas centered and 20px from the top
imagecopymerge($bkgrd, $new_image_p, $sx, $sy, 0, 0, imagesx($bkgrd), imagesy($bkgrd), 100);

// Save the image to file and free memory
if($type == "jpg") {
imagejpeg($image, $filename_vs, 80);
}
if($type == "gif") {
imagegif($image, $filename_vs);
}
if($type == "png") {
imagepng($image, $filename_vs, 9);
}

// Clean up
imagedestroy($image);
imagedestroy($image_x);
imagedestroy($image_y);
imagedestroy($image_vs);

//merge($filename_x, $filename_y, $filename_vs);

} // end if form submitted
?>
<table width="800" border="0" cellspacing="0" cellpadding="5" align="center">
<tr>
<td><div id="FormContainer">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><div id="Heading">IMAGE UPLOAD</div></td>
</tr>
</table>
<form enctype="multipart/form-data" id="form1" name="form1" method="post" action="<?php echo $FormAction; ?>">
<table border="0" align="center" cellpadding="5" cellspacing="0">
<tr>
<td colspan="2">Only JPG, JPEG, PNG and GIF files are allowed.</td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td><div align="right" class="Strong">File:</div></td>
<td><input name="ImageName" type="file" id="ImageName" size="50" /></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td nowrap="nowrap" class="ElementTitle"><div align="right">Line 1 Text:</div></td>
<td><input name="TopLine" type="text" id="TopLine" value="This is a very long first line to see what happens if it is too long" size="75" maxlength="100" /></td>
</tr>
<tr>
<td nowrap="nowrap" class="ElementTitle"><div align="right">Line 2 Text:</div></td>
<td><input name="BottomLine" type="text" id="BottomLine" value="This is a very long second line to see what happens if it is too long. Even a longer line than the first one." size="75" maxlength="100" /></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td colspan="2"><table width="150" border="0" align="center" cellpadding="5" cellspacing="0">
<tr>
<td><div align="center" style="width:80px; height:37px;">
<input name="Submit" type="submit" class="Submit" value="Upload" />
</div></td>
<td><div align="center" style="width:75px; height:37px;">
<input name="Submit22" type="reset" class="Submit" value="Reset" />
</div></td>
</tr>
</table></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
</table><input type="hidden" name="MM_insert" id="MM_insert" value="form1">
</form>
</div><!-- end form container -->
</td>
</tr>
<tr>
<td> </td>
</tr>
</table>

Basically what you are doing is

  1. Creating two images for the first line and second line
  2. Checking to see if those images are wider than your existing image
    and if so
  3. Resizing them to fit your original image width
  4. Finally merging all three images into one.

Your default text sizes can be changed here... $font_size = 22 and $font_size = 16 for the first and second line respectively.

Don't forget to upload your ttf font file and point to it correctly.

And finally, you can add code at the end to delete your two temporary files once your done with them.

Partial credit to jodebrabec for the calculateTextBox function I modified and used here. You can find it here

Sample output with short textThis shows fonts at default size

Sample output with long text This shows same image with long text resized to fit

codeigniter captcha helper is not increasing text font size

Easier solution :)

1.Goto this file yourapplication->system-helpers->captcha_helper.php

2.Find the following line and apply change as you want i.e we change font size of the default captcha font size helpers settings.

NB.You can move the entier file to you application/core and suffix the file with MY.

$font_size = 28; //edited font for captcha size modification

   // -----------------------------------
// Write the text
// -----------------------------------

$use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE;

if ($use_font == FALSE)
{
$font_size = 5;
$x = rand(0, $img_width/($length/3));
$y = 0;
}
else
{
$font_size = 28; //edited font for captcha size
$x = rand(0, $img_width/($length/1.5));
$y = $font_size+2;
}

3.Clear catch on your testing browser
4.Modify helper configuration on your controller or other places like FCPATH IS A MUST Thanks machineaddict!

 $capache_config = array(
'img_path' => 'captcha/',
'img_url' => base_url() . 'captcha/',
'img_width' => '290',
'font_path' => FCPATH . 'captcha/font/captcha4.ttf',
'img_height' => 65,
'expiration' => 7200
);

Expected Output :

Sample Image

BANG BANG I HIT THE GROUND !!!!

php , gd, create watermark, change watermark text size and background color, imagecreatefromjpeg

Why use a stamp at all? I use the following code on one of my sites:

  $im = imagecreatefromjpeg($path);

function shadow_text($im, $size, $x, $y, $font, $text)
{
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);
imagettftext($im, $size, 0, $x + 1, $y + 1, $black, $font, $text);
imagettftext($im, $size, 0, $x + 0, $y + 1, $black, $font, $text);
imagettftext($im, $size, 0, $x + 0, $y + 0, $white, $font, $text);
}

$font = '../fonts/verdana.ttf';
$size = 11;

# calculate maximum height of a character
$bbox = imagettfbbox($size, 0, $font, 'ky');
$x = 8; $y = 8 - $bbox[5];

$text = 'text to be added';
shadow_text($im, $size, $x, $y, $font, $text);

header("Content-Type: image/jpeg");
imagejpeg($im, null, 90);

This code runs fast enough that we use it to add dynamic labels on the fly to photos from our photo section as they're downloaded, rather than save them to disk.

imagecreatefrompng() + imagettftext() low quality text - how to anti alias

Explanation:

imagealphablending must be on when using imagettftext on a true-color image, otherwise the aliasing is calculated against the images brackground color instead of the color of each destination pixel.

The correct (explicit) setting would be:

//#### Load the base image
$im = imagecreatefrompng("images/SpecialClearanceBlank.png");
imagealphablending($im, true);
^^^^

Your picture has it enabled by default, that is why setting it to false previously created the non-aliased effect.



Related Topics



Leave a reply



Submit