2014-03-26 65 views
0

我試圖用水印文字創建圖像,我希望它在圖像上居中。我想要水印的文字可以是從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。

任何想法?

+0

使用等寬字體,然後您知道每個字符的寬度,然後您可以根據字符串的長度向左或向右移動。 –

+1

使用['imagettfbbox()'](http://us1.php.net/manual/en/function.imagettfbbox.php)獲取渲染文本邊界框的尺寸,然後通過一些簡單的數學運算可以讓它居中。 – Sammitch

+0

酷...不知道那個功能@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); 
}; 
?> 
+0

我如何設置右下角的位置? –

0

計算輸出圖像中的水印的位置( 水印應當被放置在圖像的中心)

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

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

使用上功能這個值。