当文本大小未知时,在图像上居中水印文本

Posted

技术标签:

【中文标题】当文本大小未知时,在图像上居中水印文本【英文标题】:Center watermark text on image when unknown size of text 【发布时间】:2014-05-05 16:14:50 【问题描述】:

我正在尝试创建一个带有水印文本的图像,并且我希望它位于图像的中心。我要添加水印的文本可以是 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。

有什么想法吗?

【问题讨论】:

使用等宽字体然后你知道每个字符的宽度,然后你可以根据字符串的长度向左或向右移动。 使用imagettfbbox()获取渲染文本边界框的尺寸,然后一些简单的数学运算将让您居中。 酷...不知道那个功能@Sammitch 谢谢@Sammitch!它有效,我将在下面发布工作代码。大家好。 【参考方案1】:

在@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); 
;
?>

【讨论】:

【参考方案2】:

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

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

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

在函数上使用这个值。

【讨论】:

以上是关于当文本大小未知时,在图像上居中水印文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在视频/图像上添加图像或文本(水印) - Flutter/Dart

手机上怎么制作图片的水印

在图像上水平和垂直居中(字体真棒)图标[重复]

PIL如何根据图像大小缩放文本大小

如何在 android 小部件 EditText 中添加水印?

winform,自定义文本框控件 实现文本框验证加水印功能