2013-08-07 1 views
0

Я пытаюсь добавить водяной знак к изображениям сразу после загрузки их на свой сайт, но кажется, что водяной знак продолжает выходить как черный объект без каких-либо подробностей. Я считаю, что скрипт работает немного, потому что, если это не так, я, вероятно, не увижу никаких водяных знаков или сценарий не сработает.PHP-скрипт водяного знака GD создает пустой водяной знак

Это мой сценарий до сих пор:

$watermark = imagecreatefrompng('preview-watermark.png'); 
$watermark_width = imagesx($watermark); 
$watermark_height = imagesy($watermark);   
$image = imagecreatetruecolor($watermark_width, $watermark_height); 
$image = imagecreatefromjpeg($portfolio_preview_dir.'/'.$file); 
$size = getimagesize($portfolio_preview_dir.'/'.$file); 
$dest_x = $size[0] - $watermark_width - 5; 
$dest_y = $size[1] - $watermark_height - 5; 
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); 
imagejpeg($image, $portfolio_preview_dir.'/'.$file); 
imagedestroy($image); 
imagedestroy($watermark); 

Это то, что она производит. Форма водяного знака является правильной, так как водяной знак 325x37 пикселей:

enter image description here

я пытался играть с самим водяным знаком изображением. Моя первая попытка состояла в том, чтобы сохранить водяной знак фотошоп (с прозрачным bg), используя «сохранить для сети» и выбрать «PNG-24». Это не сработало, поэтому я сохранил его как обычный PNG (без «сохранения для Интернета»), и он все еще не работает.

Я не уверен, что это сценарий или изображение! Может кто-нибудь, пожалуйста, поделиться некоторыми знаниями со мной и помочь исправить эту проблему?

+0

Я помню, как я читал [где-то] (http://stackoverflow.com/questions/11680734/php-watermark-png-transparency-alpha), некоторые проблемы с GD с PNG-24 и PNG-8 были бы предпочтительнее с точки зрения к wattermarks. –

ответ

1
$watermark = imagecreatefrompng('preview-watermark.png'); 
imagealphablending($watermark , false); 
imagesavealpha($watermark , true); 
$watermark_width = imagesx($watermark); 
$watermark_height = imagesy($watermark);   
$image = imagecreatetruecolor($watermark_width, $watermark_height); 
$image = imagecreatefromjpeg($portfolio_preview_dir.'/'.$file); 
$size = getimagesize($portfolio_preview_dir.'/'.$file); 
$dest_x = $size[0] - $watermark_width - 5; 
$dest_y = $size[1] - $watermark_height - 5; 
imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); 
imagejpeg($image, $portfolio_preview_dir.'/'.$file); 
imagedestroy($image); 
imagedestroy($watermark); 

Есть вещи:

  1. imagecopymerge не позволяет прозрачность PNG-24

(Источник: https://drupal.org/node/80369)

  1. imagesavealpha + imagealphablending позволяют сохранить прозрачность

(Источник: http://php.net/manual/en/function.imagesavealpha.php)

Я надеюсь, что он фиксирует вашу проблему.

Также вы выводите JPEG, почему? Оставайтесь с PNG, и ваше изображение будет поддерживать прозрачные водяные знаки, прямо сейчас это не так!

+0

На самом деле, я знаю, что ты прав. После публикации вопроса возникла связанная статья, и кто-то сказал то же самое. Я только что проверил водяной знак PNG-8, и все получилось хорошо, хотя выглядело очень грубо по краям.Я пойду на изменение «imagecopymerge», кроме PNG-24. Благодарю. – TheCarver

+0

Замечательно, я добавил что-то дополнительное для ответа, почему вы используете imagejpeg вместо imagepng? –

+0

Мой пользователь загружает файл JPEG, и сценарий загрузки сохраняет его как файл JPEG, поэтому я полагаю, что я просто пытался сохранить его все равно. Я должен был бы изменить справедливый бит кода в остальной части приложения, если бы я использовал PNG. – TheCarver

0

Существует много решений на SO и php.net. Это one (без создания самого нового образа)

// Load the stamp and the photo to apply the watermark to 
$stamp = imagecreatefrompng('stamp.png'); 
$im = imagecreatefromjpeg('photo.jpeg'); 

// Set the margins for the stamp and get the height/width of the stamp image 
$marge_right = 10; 
$marge_bottom = 10; 
$sx = imagesx($stamp); 
$sy = imagesy($stamp); 

// Copy the stamp image onto our photo using the margin offsets and the photo 
// width to calculate positioning of the stamp. 
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp)); 

// Output and free memory 
header('Content-type: image/png'); 
imagepng($im); 
imagedestroy($im); 

редактировать

Водяной знак должен быть сохранен с альфа channek (прозрачность). Photoshop, так как CS2 (за исключением Интернета) должен это сделать, также GIMP отлично работает.

+0

Спасибо за ваше время, но я действительно не ищу новый скрипт, я просто хочу узнать, почему это происходит и исправить скрипт, который у меня есть. – TheCarver

+0

Вы написали «Я не уверен, что это сценарий или изображение», поэтому я предполагаю, что ваш скрипт (без дальнейшего анализа) работает неправильно. Мы не можем проверить, нормально ли изображение, потому что вы его не привязали. – kwarunek