Добавить "Водяной знак" к изображениям с php
У меня есть сайт, где пользователи могут загружать изображения...
Мне нужно добавить свой логотип (водяной знак) к изображениям после их загрузки.
Как я могу это сделать?
И важно, чтобы водяной знак находился в углу, где он будет виден, например, я видел сайты, которые генерируют водяной знак на лету и ставят метку там, где фон основного изображения "одного цвета", поэтому водяной знак торчит, если вы понимаете, о чем я.
У кого-нибудь есть хороший учебник или статья по этому поводу? Или знаете о какой-либо функции в php, что мне нужно найти положение водяного знака?
7 ответов
Хороший пример в руководстве по PHP:
// 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);
Использовать эту функцию
тип изображения водяного знака должен быть "png"
function watermark_image($target, $wtrmrk_file, $newcopy) {
$watermark = imagecreatefrompng($wtrmrk_file);
imagealphablending($watermark, false);
imagesavealpha($watermark, true);
$img = imagecreatefromjpeg($target);
$img_w = imagesx($img);
$img_h = imagesy($img);
$wtrmrk_w = imagesx($watermark);
$wtrmrk_h = imagesy($watermark);
$dst_x = ($img_w / 2) - ($wtrmrk_w / 2); // For centering the watermark on any image
$dst_y = ($img_h / 2) - ($wtrmrk_h / 2); // For centering the watermark on any image
imagecopy($img, $watermark, $dst_x, $dst_y, 0, 0, $wtrmrk_w, $wtrmrk_h);
imagejpeg($img, $newcopy, 100);
imagedestroy($img);
imagedestroy($watermark);
}
watermark_image('image_name.jpg','watermark.png', 'new_image_name.jpg');
Хороший пример изображения водяного знака и расположен в центре
<?php
// Load the stamp and the photo to apply the watermark to
$stamp = imagecreatefrompng('stampimg.png');
$im = imagecreatefrompng('mainimage.png');
// 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);
$imgx = imagesx($im);
$imgy = imagesy($im);
$centerX=round($imgx/2);
$centerY=round($imgy/2);
// Copy the stamp image onto our photo using the margin offsets and the photo
// width to calculate positioning of the stamp.
imagecopy($im, $stamp, $centerX, $centerY, 0, 0, imagesx($stamp), imagesy($stamp));
// Output and free memory
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
Я нашел гораздо лучшее решение, которое динамически добавляет водяной знак через.htaccess, вы можете найти учебник здесь:
Добавить водяной знак к изображениям через htaccess
После загрузки пользовательского файла.htaccess, scrypt watermark.php и вашего изображения watermark.png все изображения в папке и ее подпапках будут показывать водяной знак, однако исходный файл все равно будет сохраняться на сервере.
Надеюсь, что кому-то поможет так же, как и мне.
ImageMagick хорошо работает для этого. Я делал это раньше. Однако весь бизнес - это немного больно. Особенно, если вы хотите модные смешанные режимы и тому подобное.
// Load the stamp and the photo to apply the watermark to
$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpg');
$save_watermark_photo_address = 'watermark_photo.jpg';
// 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');
imagejpeg($im, $save_watermark_photo_address, 80);
imagedestroy($im);
Это можно сделать с помощью библиотеки манипуляций с изображениями, такой как GD или ImageMagick. Вот учебник, который объясняет способ сделать это с помощью GD: