Añadir Marca de Agua a Imágenes

Un conocido tiene unas imágenes de estudio que le han realizado para una tienda online de unos artículos y tiene miedo de que la competencia pueda robarle las imágenes.

¿Cómo podría añadir alguna "marca de agua" para que la competencia no vaya a copiarle las imágenes?.

Saludos ;)
Si la tienda online esta hecha con prestashop, magento, woocommerce... Suele haber módulos u opciones nativas para poner marca de agua a las imágenes de la tienda .
Puedes automatizarlo creando una accion en Photoshop y luego con un lote o un dropplet. Si te atreves con los comandos, con Imagemagick tambien se puede hacer:

http://www.imagemagick.org/Usage/annotating/#watermarking
Elaphe escribió:Puedes automatizarlo creando una accion en Photoshop y luego con un lote o un dropplet. Si te atreves con los comandos, con Imagemagick tambien se puede hacer:

http://www.imagemagick.org/Usage/annotating/#watermarking

Perfecto con Imagemagick ;)

Kelmer escribió:Con PHP es muy facil de hacer, aqui hay un tutorial:

http://php.net/manual/es/image.examples-watermark.php


Una duda básica, viendo que mediante PHP lo puedo hacer para una imagen, quiero hacer lo mismo pero para todas las imágenes que se encuentran en un directorio. Planteo lo siguiente:
<?php
// Cargar la estampa y la foto para aplicarle la marca de agua
$estampa = imagecreatefrompng('estampa3.png');

// listar ficheros

function listar_archivos($carpeta){
    if(is_dir($carpeta)){
        if($dir = opendir($carpeta)){
            while(($archivo = readdir($dir)) !== false){
                if($archivo != '.' && $archivo != '..' && $archivo != '.htaccess'){
                                        $archivo = "'{$archivo}'";
               $vector[$i]= $archivo;
                             

         
               
               //$im = imagecreatefromjpeg($vector[$i]);
               $im = imagecreatefromjpeg($archivo);
               
               $margen_dcho = 100;
               $margen_inf = 10;
               $sx = imagesx($estampa);
               $sy = imagesy($estampa);
               
               imagecopy($im, $estampa, imagesx($im) - $sx - $margen_dcho, imagesy($im) - $sy - $margen_inf, 0, 0, imagesx($estampa), imagesy($estampa));
               
               header('Content-type: image/png');
               imagepng($im, $vector[$i], 0);
               imagedestroy($im); $i++;

                }
            }
            closedir($dir);
        }
    }
}

echo listar_archivos('C:\inetpub\vhosts\elotrolado2017.net\httpdocs\fts');


La idea es recorrer un directorio que contendra imágenes y almacenar todos los nombres de las imagenes en un vector. A cada elemento del vector aplicarle el tratamiento de la marca de agua para que genere la imagen en el directorio.

Si a imagecreatefromjpeg() le paso directamente la 'imagen.jpeg' funciona correctamente, si le paso un elemento del vector, que contiene 'imagen.jpeg' no funciona.

Lo que quiero hacer para 1 imagen -y escribiendo esta de maneral literal en el código- funciona pero si lo quiero automatizar recorriendo las imágenes que hay en un directorio y usando los nombres de éstas no lo consigo.

Simplificado (FUNCIONA)
<?php
// Cargar la estampa y la foto para aplicarle la marca de agua
$estampa = imagecreatefrompng('estampa3.png');
$im = imagecreatefromjpeg('foto.jpeg');

// Establecer los márgenes para la estampa y obtener el alto/ancho de la imagen de la estampa
$margen_dcho = 120;
$margen_inf = 10;
$sx = imagesx($estampa);
$sy = imagesy($estampa);

// Copiar la imagen de la estampa sobre nuestra foto usando los índices de márgen y el
// ancho de la foto para calcular la posición de la estampa.
imagecopy($im, $estampa, imagesx($im) - $sx - $margen_dcho, imagesy($im) - $sy - $margen_inf, 0, 0, imagesx($estampa), imagesy($estampa));


// Imprimir y liberar memoria
header('Content-type: image/png');
$inom = '_con_watermark.png';
imagepng($im, $inom, 0);
imagedestroy($im);


Simplificado (NO FUNCIONA)
<?php
// Cargar la estampa y la foto para aplicarle la marca de agua
$estampa = imagecreatefrompng('estampa3.png');
$nom = "foto.jpeg";
$archivo ="'{$nom}'";
$im = imagecreatefromjpeg($archivo);

// Establecer los márgenes para la estampa y obtener el alto/ancho de la imagen de la estampa
$margen_dcho = 120;
$margen_inf = 10;
$sx = imagesx($estampa);
$sy = imagesy($estampa);

// Copiar la imagen de la estampa sobre nuestra foto usando los índices de márgen y el
// ancho de la foto para calcular la posición de la estampa.
imagecopy($im, $estampa, imagesx($im) - $sx - $margen_dcho, imagesy($im) - $sy - $margen_inf, 0, 0, imagesx($estampa), imagesy($estampa));


// Imprimir y liberar memoria
header('Content-type: image/png');
$inom = '_con_watermark.png';
imagepng($im, $inom, 0);
imagedestroy($im);
Uf, me sobrepasan todas esas dudas. Yo no soy programador. He hecho cosas basicas con Imagemagick pero poco mas. Siento no poder ayudarte :(
Elaphe escribió:Uf, me sobrepasan todas esas dudas. Yo no soy programador. He hecho cosas basicas con Imagemagick pero poco mas. Siento no poder ayudarte :(


@Elaphe en cuando a ImageMagick obtenía la marca de agua, pero tenía la pena de el resultado no era el deseado por cómo funciona composite y el tipo de imágenes que necesita.

En PHP el asunto viene de que la función imagecreatefromjpeg() trabaja con ficheros o URLs; esa función tenia problemas cuando le pasaba la variable $archivo.

Después de recorrer la carpeta he puesto los ficheros por URL http://elotrolado2017.net/fts/$archivo y solucionado ;)

Gracias a todos por la ayuda ;)
6 respuestas