Podriamos añadir marcas de agua usando Photoshop pero cuando tenemos cientos de imágenes y encima queremos que las imágenes que suban los usuarios automáticamente tengan una marca de agua lo mejor es hacer que PHP se encargue, para eso vamos a usar GD2.

Para los que no conocen GD2 es una extensión de PHP que nos permite manejar imágenes en los principales formatos web JPG, GIF, PNG, nos permite cambiarles el tamaaño, crear imágenes nuevas, ponerles textos, crear captchas, etc.

OJO En la mayoría de servidores se encuentra instalada por defecto, si trabajamos en localhost es posible que debamos activarla primero si usas Wamp PHP/PHP extensions/GD2

Creando la marca de agua

Podemos usar un PNG 24bits o un PNG común, la ventaja del primero es que podremos tener un watermark semitransparente y sin bordes pixelados para obtener un mejor efecto.

GD2 con PHP

Bueno veamos esta función para crear la marca de agua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/// la imagen que usaremos como marca de agua
$watermark = "proof150.png"; /// PNG 8 o 24 bits
$quality = "75"; // calidad del JPG resultante
$imagedir = "images";
watermark($imagen_original, $imagen_con_watermark, $watermark, $quality);

function watermark($srcfilename, $newname, $watermark, $quality) {
$imageInfo = getimagesize($srcfilename);
$width = $imageInfo[0];
$height = $imageInfo[1];
$logoinfo = getimagesize($watermark);
$logowidth = $logoinfo[0];
$logoheight = $logoinfo[1];
$horizextra =$width - $logowidth;
$vertextra =$height - $logoheight;
$horizmargin =  round($horizextra / 2);
$vertmargin =  round($vertextra / 2);
$photoImage = ImageCreateFromJPEG($srcfilename);
ImageAlphaBlending($photoImage, true);
$logoImage = ImageCreateFromPNG($watermark);
imagealphablending($logoImage,true);
$logoW = ImageSX($logoImage);
$logoH = ImageSY($logoImage);
// añadimos marca de agua
ImageCopy($photoImage, $logoImage, $horizmargin, $vertmargin, 0, 0, $logoW, $logoH);
//ImageJPEG($photoImage); // No grabarlo sino mostrarlo en el browser
ImageJPEG($photoImage,"images/watermarked/wm_".$newname, $quality);
// Liberamos memoria
ImageDestroy($photoImage);
ImageDestroy($logoImage);
}

Como imagen de origen podemos usar un archivo ya existente o podríamos usar una imagen enviada desde un formulario.