Inicio de sesión

RSS

Distribuir contenido

En línea

En este momento hay 1 usuario y 7 invitados en línea.

Marcas de agua automáticas con PHP y GD

En todos los foros dedicados al desarrollo web hay por lo menos un thread dedicado al tema de proteger al contenido del sitio web o su código fuente de ser guardado por el usuario. Si bien existen varios programas que ocultan el código (e incluso algunos llegan a prohibir los clicks del botón derecho del mouse), siempre se llega a la conclusión de que proteger el contenido de un sitio es imposible (protegerlo para todos los usuarios, claro que siempre se pueden usar métodos de autenticación).

Lo mismo pasa con las imágenes: se pueden guardan desde los temporales (suponiendo que por algún extraño motivo no se pueda desde el browser directamente), o simplemente haciendo una captura de pantalla.

En conclusión, todo lo que llega a la pantalla del usuario le pertenece y puede hacer con eso lo que quiera.

Sin embargo, lo que se suele hacer a la hora de proteger imágenes es aplicarles una marca de agua, es decir, una imágen translúcida que indica que la imágen no puede ser usada en otro sitio, para fines comerciales, etc.

Y es ahí donde la librería GD para tratamiento de imágenes entra en juego. Usando dicha librería, un poco de PHP y la magia de los PNG's se puede automatizar la tediosa tarea de aplicar marcas de agua a diferentes imágenes.

Primero es necesario crear una marca de agua en formato PNG. La ventaja principal de éste formato (indispensable en este caso) es que permite 255 niveles de transparencias, por lo que se puede lograr una imágen translúcida.

Una vez creada la marca, se puede aplicar en la imágen usando PHP. Pueden ver el código aqui...

<?php

$image = $_GET['i'];
$watermark = "water.png";

$im = imagecreatefrompng($watermark);

$ext = substr($image, -3);

if(strtolower($ext) == "gif") {
  if (!$im2 = imagecreatefromgif($image)) {
    echo "Error opening $image!";
    exit;
  }
} else if(strtolower($ext) == "jpg") {
  if (!$im2 = imagecreatefromjpeg($image)) {
    echo "Error opening $image!";
    exit;
  }
} else if(strtolower($ext) == "png") {
  if (!$im2 = imagecreatefrompng($image)) {
    echo "Error opening $image!";
    exit;
  }
} else {
  die;
}

imagecopy($im2, $im, (imagesx($im2)/2)-(imagesx($im)/2), (imagesy($im2)/2)-(imagesy($im)/2), 0, 0, imagesx($im), imagesy($im));

if($_GET[repeat]) {
  $waterless = imagesx($im2) - imagesx($im);
  $rest = ceil($waterless/imagesx($im)/2);

  for($n=1; $n<=$rest; $n++) {
    imagecopy($im2, $im, ((imagesx($im2)/2)-(imagesx($im)/2))-(imagesx($im)*$n), (imagesy($im2)/2)-(imagesy($im)/2), 0, 0, imagesx($im), imagesy($im));
    imagecopy($im2, $im, ((imagesx($im2)/2)-(imagesx($im)/2))+(imagesx($im)*$n), (imagesy($im2)/2)-(imagesy($im)/2), 0, 0, imagesx($im), imagesy($im));
  }
}

header("Content-Type: image/jpeg");
imagejpeg($im2);
imagedestroy($im);
imagedestroy($im2);

?>

Basta con pasarle la URL de la imágen a la cual se le desea aplicar la marca de agua a través de la URL...

watermark.php?i=brown_lady.jpgwatermark.php?i=brown_lady.jpg

También pueden probar pasándole la variable repeat para que repita la marca de agua horizontalmente...

watermark.php?i=brown_lady.jpg&amp;repeat=twatermark.php?i=brown_lady.jpg&repeat=t

Claro que es muy importante que restringan el acceso al directorio en donde se alojan las imágenes originales. Un simple .htaccess con la sentencia deny from all debería ser suficiente (en servers apache, claro).

Es importante tener en cuenta que el método no es infalible, cualquier persona con experiencia en el uso de un buen editor de imágenes puede remover la marca sin dejar rastro.

Autor

Enviar un comentario nuevo

El contenido de este campo se mantiene como privado y no se muestra públicamente.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <i> <b> <h2> <h3> <tt> <blockcode>
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. Beside the tag style "<foo>" it is also possible to use "[foo]". PHP source code can also be enclosed in <?php ... ?> or <% ... %>.
  • Saltos automáticos de líneas y de párrafos.
  • Every instance heading tags will be modified to include an id attribute for anchor linking.
  • Se pueden agregar imágenes a este envío.
  • Every instance of "<!--tableofcontents-->" in the input text will be replaced with a collapsible mediawiki-style table of contents. Accepts options for title, list style, minimum heading level, and maximum heading level as follows: <!--tableofcontents list: ol; title: Table of Contents; minlevel: 1; maxlevel: 3;-->. All arguments are optional and defaults are shown.

Más información sobre opciones de formato

CAPTCHA
Esta pregunta es para verificar que eres humano y así mismo eviar el SPAM.
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.

Publicidad