当文本大小未知时,将水印文本居中


Center watermark text on image when unknown size of text

我试图创建一个图像与水印文本在它,我希望它是中央的图像。我想要水印的文本可以是5个字符到15个字符之间的任何地方,因此我不能为文本设置一个适合每个图像的最终大小。

这是我用来创建带水印的图像 的代码
function watermarkImage ($SourceFile, $WaterMarkText, $DestinationFile) { 
 list($width, $height) = getimagesize($SourceFile);
 $image_p = imagecreatetruecolor($width, $height);
 $image = imagecreatefromjpeg($SourceFile);
 imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width, $height); 
 $black = imagecolorallocate($image_p, 0, 0, 0);
 $font = '../fonts/proxima-nova-light.otf';
 $font_size = 100; 
 imagettftext($image_p, $font_size, 0, 303, 190, $black, $font, $WaterMarkText);
 if ($DestinationFile<>'') {
   imagejpeg ($image_p, $DestinationFile, 100); 
 } else {
   header('Content-Type: image/jpeg');
   imagejpeg($image_p, null, 100);
 };
 imagedestroy($image); 
 imagedestroy($image_p); 
};

这在一些文本上做得很好,但当我在较长的文本上尝试时,它看起来很糟糕。

我想以某种方式计算文本的最佳大小,并从中选择大小x和y。

任何想法?

在@Sammitch的帮助下做了一些研究后,我终于找到了答案。下面是工作代码:

<?php
function watermarkImage ($SourceFile, $WaterMarkText, $DestinationFile) { 
$font = 'fonts/your-font-here.ttf';
$font_size = 40; 
list($width, $height) = getimagesize($SourceFile);
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($SourceFile);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width, $height); 
$black = imagecolorallocate($image_p, 0, 0, 0);
$bbox = imagettfbbox($font_size, 0, $font, $WaterMarkText);
$x = $bbox[0] + (imagesx($image) / 2) - ($bbox[4] / 2) + 10;
$y = $bbox[1] + (imagesy($image) / 2) - ($bbox[5] / 2) - 5;
imagettftext($image_p, $font_size, 0, $x, $y, $black, $font, $WaterMarkText);
if ($DestinationFile<>'') {
  imagejpeg ($image_p, $DestinationFile, 100); 
} else {
  header('Content-Type: image/jpeg');
  imagejpeg($image_p, null, 100);
};
imagedestroy($image); 
imagedestroy($image_p); 
};
?>

计算水印在输出图像中的位置水印应放置在图像中央)

$watermark_pos_x = (imagesx($image)/2) - (imagesx($watermark)/2) - 15;
$watermark_pos_y = (imagesy($image)/2) - (imagesy($watermark)/2) - 10;