2015-12-09 3 views
2

Привет, я пытаюсь изменить размер водяного знака png на загруженные изображения, но просто не могу понять, что я делаю неправильно.Как изменить размер водяного знака на изображении с помощью PHP?

Вот мой код:

// BEGIN WATERMARK 

$watermark = imagecreatefrompng ('watermark.png'); 
$watermark_width = imagesx($watermark); 
$watermark_height = imagesy($watermark); 
$image = imagecreatetruecolor($watermark_width, $watermark_height); 
$_Dim[x] = imageSX($destImage); 
$_Dim[y] = imageSY($destImage); 
$logo_Dim[x] = imageSX($watermark); 
$logo_Dim[y] = imageSY($watermark); 
$x = $_Dim[x] - $logo_Dim[x]; 
$y = $_Dim[y] - $logo_Dim[y]; 
imagecopy ($destImage, $watermark, $x, $y, 0, 0, $watermark_width, $watermark_height); 
imagedestroy ($watermark); 

// END WATERMARK 

ответ

2

Использование: imagecopyresized или imagecopyresampled

$watermark = imagecreatefrompng ('watermark.png'); 
$watermark_width = imagesx($watermark); 
$watermark_height = imagesy($watermark); 

// this is an example to resized your watermark to 0.5% from their original size. 
// You can change this with your specific new sizes. 
$percent = 0.5; 
$newwidth = $watermark_width * $percent; 
$newheight = $watermark_height * $percent; 

// create a new image with the new dimension. 
$new_watermark = imagecreatetruecolor($newwidth, $newheight); 

// Retain image transparency for your watermark, if any. 
imagealphablending($new_watermark, false); 
imagesavealpha($new_watermark, true); 

// copy $watermark, and resized, into $new_watermark 
// change to `imagecopyresampled` for better quality 
imagecopyresized($new_watermark, $watermark, 0, 0, 0, 0, $newwidth, $newheight, $watermark_width, $watermark_height); 

$_Dim[x] = imageSX($destImage); 
$_Dim[y] = imageSY($destImage); 
$logo_Dim[x] = imageSX($new_watermark); 
$logo_Dim[y] = imageSY($new_watermark); 
$x = $_Dim[x] - $logo_Dim[x]; 
$y = $_Dim[y] - $logo_Dim[y]; 
imagecopy ($destImage, $new_watermark, $x, $y, 0, 0, $newwidth, $newheight); 
imagedestroy ($new_watermark); 

Примечание: Я предполагаю, что у вас есть еще imageSX & imageSY функции, так как встроенные в функциях во всех случаях: imagesx & imagesy.

Редактировать 1: имя функции в php не чувствительно к регистру, но это хорошая практика для вызова функций, как они появляются в их объявлении.

Редактировать 2: Добавить код для сохранения прозрачности.

+0

Все в PHP чувствителен к регистру. Печально, но верно. – miken32

+0

Это работает как шарм. Вы спасли мой вечер, спасибо, cwps. – AlesTom

+1

@ miken32 По крайней мере, это непротиворечиво :-) –

1

Вы можете использовать эту функцию для изменения размера штампа. Не используйте imagecopyresized, потому что он искажает ваше изображение, и вы получите более низкое качество. Лучше imagecopyresampled. imagesavealpha и imagealphablending предоставить вам сделать прозрачный фон для вас штамповать

$image = imagecreatefromstring(file_get_contents('The_img.jpg')); 
$stamp = imagecreatefrompng('the_watermark.png'); 

$stamp_new = imagecreatetruecolor(100,50); 
imagealphablending($stamp_new, false); 
imagesavealpha($stamp_new, true); 
imagecopyresampled($stamp_new, $stamp, 0, 0, 0, 0, 100, 50, imagesx($stamp),imagesy($stamp)); 

$margin = ['right' => 20, 'bottom' => 20]; // Смещение от края 
imagecopy($image, $stamp_new, 
imagesx($image) - imagesx($stamp_new) - $margin['right'], 
imagesy($image) - imagesy($stamp_new) - $margin['bottom'], 
0, 0, imagesx($stamp_new), imagesy($stamp_new)); 
$imageName = 'newimage.jpg'; 
$dirName = 'test_folder'; 
if(!file_exists($dirName)){ 
    mkdir($dirName, 0755, true); 
    imagepng($image, $dirName.'/'.$imageName); 
} else { 
    imagepng($image, $dirName.'/'.$imageName); 
} 

ImageDestroy($image); 
ImageDestroy($stamp); 
Смежные вопросы