PHP GD - 水平对齐文本中心并减小字体大小以使其保持在图像中

时间:2013-04-13 00:12:14

标签: php gd centering alignment

希望你做得很好。

我仍然是一个新手用PHP所以在做了一些阅读并在检查一些帖子在这里我能够使用PHP GD在imagecreatefrompng()函数的图像上放置一些文本,用户将来到一个表单,他们将能够输入他们的名字并且名字将被写在图像上,遗憾的是我无法水平对齐文本中心,我尝试了所有可能的方式(我的方式显然并且一定是错的)与imagettfbbox但是我失败了我所有的尝试,请你帮助我一点点水平对齐弦乐中心?此外,由于我使用的是一种替代的大字体,如果输入的名称有点长,我需要缩小尺寸,这样它就不会超过图像限制并保持在中心位置。我从表单中获取文本的值,您可以在我的代码开头查看:

<?php
 $nombre=$_POST['nombre'];
  //Set the Content Type
  header('Content-type: image/jpeg');

  // Create Image From Existing File
  $jpg_image = imagecreatefromjpeg('fabian.jpg');

  // Allocate A Color For The Text
  $white = imagecolorallocate($jpg_image, 255, 255, 255);

  // Set Path to Font File
  $font_path = 'fabian.TTF';

  // Set Text to Be Printed On Image , I set it to uppercase
  $text =strtoupper($nombre);

  // Print Text On Image
  imagettftext($jpg_image, 75, 0, 50, 400, $white, $font_path, $text);



  // Send Image to Browser
  imagepng($jpg_image);

  // Clear Memory
  imagedestroy($jpg_image);

  ?>

您的帮助将受到高度赞赏,稍后我将通过单击提交按钮来尝试保存图像,因为我不希望用户通过右键单击来保存图像。

谢谢好朋友!

2 个答案:

答案 0 :(得分:15)

您需要将图像的宽度和文本的宽度相关联。

// get image dimensions
list($img_width, $img_height,,) = getimagesize("fabian.jpg");

// find font-size for $txt_width = 80% of $img_width...
$font_size = 1; 
$txt_max_width = intval(0.8 * $img_width);    

do {        
    $font_size++;
    $p = imagettfbbox($font_size, 0, $font_path, $text);
    $txt_width = $p[2] - $p[0];
    // $txt_height=$p[1]-$p[7]; // just in case you need it
} while ($txt_width <= $txt_max_width);

// now center the text
$y = $img_height * 0.9; // baseline of text at 90% of $img_height
$x = ($img_width - $txt_width) / 2;

imagettftext($jpg_image, $font_size, 0, $x, $y, $white, $font_path, $text);

答案 1 :(得分:4)

您可以使用stil/gd-text类来对齐文本。免责声明:我是作者。

<?php
use GDText\Box;
use GDText\Color;

$jpg_image = imagecreatefromjpeg('fabian.jpg');

$textbox = new Box($jpg_image);
$textbox->setFontSize(75);
$textbox->setFontFace('fabian.TTF');
$textbox->setFontColor(new Color(255, 255, 255));
$textbox->setBox(
    50,  // distance from left edge
    50,  // distance from top edge
    200, // textbox width
    100  // textbox height
);

// text will be aligned inside textbox to center horizontally and to top vertically
$textbox->setTextAlign('center', 'top');
$textbox->draw(strtoupper($nombre));

然而,这不是一个完整的答案,因为它不能自动减小字体大小。