De canales, huellas, máscaras, secretos y grafos

Parte II – Enmascarando la fotografía.

Un método muy utilizado es el denominado “marca de agua” que consiste en sobre impresionar una imagen o un texto sobre la fotografía original. Suele hacerse usando un efecto de transparencia de modo que se pueda ver debajo de la “marca de agua” la imagen original.

Para hacerlo se suele emplear cualquier programa de edición de imágenes que permita trabajar con varias capas y pueda gestionar la transparencia de las mismas.

Eso está bien si vas a poner la “marca de agua” a una o a pocas imágenes. Cuando quieres automatizar la tarea (por ejemplo, a 2000 fotografías) puede ser una tarea inabarcable. Y más si quieres personalizar la marca de agua.

Así que os voy a explicar cómo poner una marca de agua a un número indeterminado de imágenes.

Y, como siempre, vamos a utilizar software libre.

La herramienta a utilizar en este caso es ImageMagick. Además de interfaz gráfica, tiene una interfaz de línea de comandos.

Vamos a hacer un programa que añada una marca de agua a todas las imágenes de un directorio. La marca de agua será personalizada para cada imagen.

Usaremos los campos EXIF (ImageDescription y Author) que hemos incrustado en las imágenes en el capítulo anterior, ajustaremos el tamaño de la marca a un porcentaje de la imagen, definiremos la opacidad de modo que no sea demasiado intrusiva y, de paso, cambiaremos el tamaño de salida para que no sea utilizada para imprimirla con calidad.

Vamos a programar esta funcionalidad usando el lenguaje de “scripting” de MS Windows. Es una evolución del mítico lenguaje de comandos que se arrastraba desde las primeras versiones de MS-DOS. Había que adaptarse a los tiempos y tener en lenguaje más potente a semejanza de las shells (ventanas de intérpretes de comandos) de UNIX.

El aspecto de la antigua ventana de comandos y el de la nueva PowerShell es similar. Pero las mejoras son evidentes.

Para lanzarla, simplemente escribe Powershell en la ventana de búsqueda de la barra de tareas.

Con el Bloc de Notas crea un nuevo fichero con extensión ps1 (es la extensión con la que Powershell reconoce los scripts.

Vamos a ello.

En la primera parte del código definimos los directorios de trabajo. Las imágenes originales estarán ubicadas en el directorio entrada y las que generemos con marca de agua irán al directorio salida.

# DIRECTORIOS DE IMÁGENES
$inputDir = "entrada"
$outputDir = "salida"
# AÑO PARA INCLUIRLO EN LA MARCA DE AGUA CON LA INFO DE COPYRIGHT
$fecha = (Get-Date).Year
# SI NO EXISTE EL DIRECTORIO DE SALIDA, LO CREAMOS
if (!(Test-Path -Path $outputDir)) {
    New-Item -ItemType Directory -Path $outputDir | Out-Null
}

El programa consiste en un bucle que recorre todas las imágenes del directorio donde residen las imágenes que queremos modificar.

Get-ChildItem -Path $inputDir -Filter "*.jpg" | ForEach-Object {
    $entrada = $_.FullName
    $nombreArchivo = $_.BaseName
    $salida = "$outputDir\$nombreArchivo-watermark.jpg"
    [PROCESO GENERACIÓN MARCA DE AGUA]
}

En la primera línea se seleccionan todos los archivos con extensión JPG del directorio de entrada y por cada uno de ellos ($_ es el índice dentro del loop que en cada iteración lleva un objeto que representa a cada fichero de imagen):

  1. Extraemos el nombre del fichero completo.
  2. Extraemos la parte del nombre de fichero sin la extensión.
  3. Definimos el nombre del fichero final apuntando al directorio de salida y agregando “-watermark” para identificarlos.

Entramos ya en el proceso propiamente dicho:

    # OBTENER LOS CAMPOS 'ImageDescription' Y 'Artist' DEL EXIF
    $descripcion = (magick identify -format "%[EXIF:ImageDescription]" "$entrada")
    $artist = (magick identify -format "%[EXIF:Artist]" "$entrada")
    if (-not $artist) { $artist = "rafasith" }
    $textoFirma = "$artist - $fecha"

Como he comentado antes, usaremos los campos EXIF introducidos en las imágenes en el apartado anterior para generar los textos de las marcas de agua.

Aquí ya empleamos el comando magick (que va en la distribución de ImageMagick). Recuerda incluir en la variable de entorno PATH el directorio donde hayas instalado la utilidad gráfica.

En este código generamos dos variables $descripcion y $textoFirma con los datos obtenidos del EXIF al que añadimos el año para que se muestre en la marca de agua.

    # DIMENSIONES (ANCHO x ALTO) DE LA IMAGEN
    $dimensiones = magick identify -format "%w %h" "$entrada"
    $ancho, $alto = $dimensiones -split ' '
    $ancho = [int]$ancho
    $alto = [int]$alto
    $offsetY = [math]::Round($alto * 0.25)
    # MARCA DE AGUA ($descripcion)
    # ~90% DEL ANCHO, COLOR NEGRO
    $testSize = 100
    $anchuraTexto = magick -background none -fill black -pointsize $testSize label:"$descripcion" -format "%w" info:
    $anchuraTexto = [int]$anchuraTexto
    $factor = 0.9 * $ancho / $anchuraTexto
    $pointsize = [math]::Round($testSize * $factor)
    # GENERACIÓN MASCARA CENTRADA HORIZONTAMENTE, OPACIDAD DEL 60%
    magick -size ${ancho}x${alto} canvas:none `
        -gravity North `
        -fill black -pointsize $pointsize `
        -annotate +0+$offsetY "$descripcion" `
        -evaluate Multiply 0.6 `
        marca_1_overlay.png

Esta parte estima el tamaño que debe tener la marca de agua para que ocupe el 90% del ancho de la imagen y la ubique al 75% de la altura.

He marcado en rojo la salida de esta parte del código. marca_1_overlay.png es un archivo de imagen que contiene la marca de agua y que luego utilizaremos para mezclar con la foto original. Este archivo se borra en cada iteración del bucle.

Para añadir la segunda marca el procedimiento es similar (simplemente, usaremos otros parámetros de color, tamaño y opacidad).

    # MARCA DE AGUA ($textofirma)
    # ~50% DEL ANCHO, COLOR BLANCO
    $testSizeAdicional = 50
    $anchuraTextoAdicional = magick -background none -fill white -pointsize $testSizeAdicional label:"$textoFirma" -format "%w" info:
    $anchuraTextoAdicional = [int]$anchuraTextoAdicional
    $factorAdicional = 0.5 * $ancho / $anchuraTextoAdicional
    $pointsizeAdicional = [math]::Round($testSizeAdicional * $factorAdicional)
    # GENERACIÓN MASCARA CENTRADA HORIZONTAMENTE, OPACIDAD DEL 70%
    magick marca_1_overlay.png -gravity South `
        -fill white -pointsize $pointsizeAdicional `
        -annotate +0+20 "$textoFirma" `
        -evaluate Multiply 0.7 `
        marca_2_overlay.png

Si quisiéramos añadir más objetos en la marca de agua podemos repetir este proceso teniendo en cuenta que se van añadiendo una tras otra.

Ahora toca mezclar la imagen original ($entrada) con la máscara final (que es la suma de las máscaras que queramos):

    # COMPOSICIÓN DE LA IMAGEN FINAL
    magick "$entrada" marca_2_overlay.png -composite "$salida"

Redimensionar las imágenes a un tamaño menor es tan sencillo como esto

    # REDIMENSIONAR A 1500 PIXELES
    magick "$salida" -resize 1500x "$salida"
    # ELIMINACIÓN ARCHIVOS TEMPORALES
    Remove-Item marca_1_overlay.png, marca_2_overlay.png

Salvas el fichero, lo ejecutas desde la ventana de PowerShell y al cabo de un rato tendrás el directorio de salida con las imágenes a las que se le habrá añadido la marca.

Aquí un ejemplo:

Ponte Contarini desde Ramo Contarini

Espero que este método te sirva para personalizar tus marcas de agua con otros campos EXIF o, si te atreves, con marcas gráficas que incluyan logotipos.

Bueno, Esto está bien, pero se ve mucho.

¿Qué te parece si incrustamos una marca de agua que no se vea? Así pillaremos a quien utilice la foto sin autorización porque creará que no tiene marca de agua.

Páginas: 1 2 3 4 5 6



Deja un comentario

About Me

Físico por formación, astrónomo por devoción, ingeniero por alimentación, poeta por necesidad.

Diletante eterno, efímero polímata

Entradas recientes

Agendas Astronomía Astronáutica Calendarios Eclipses Einstein Fotografía Física Historia LHC Moonrises Programación Viajes