Este es mi script ahora.
#!/bin/bash
#
# Pone un marco con sombra a las imágenes que le digamos
#
# Basado en el script dropsh de Jesús J. Del Carpio
# http://www.isgeek.net/files/dropsh
#
# version-5
# Valores por defecto
DTIT1="http://www.fotolibre.net"
DTIT2="%d"
#DCOPY=" $(date +%Y) colegota.fotolibre.net"
DCOPY=" colegota.fotolibre.net"
DFONT1="Bitstream-Vera-Sans-Bold-Oblique"
DFONT2="$DFONT1"
DFONT="$DFONT1"
DCCFONT="/home/colegota/bajadas/fuentes/cc-icons.ttf"
DICONOS='c,b,a'
DTAMANO1="" # Los tamaños de fuente calculan luego como 3/5 del ancho
DTAMANO2=""
DTAMANO3=""
DMARCO="" # Tamaño del marco por defecto
DANCHO=""
DPOS1="center"
DPOS2="west"
DPOSCOPY="east"
DCOLOR="Black"
DTINTA="Orange"
DSOMBRA="12"
DBORDE="25"
DFCOLOR="Orange"
DFILETE="2"
DTIPOSOMBRA="2" # 0=imagen dessaturada 1=opaca 2=color
CONFILETE="1"
PREFIJO="f_"
TIT1="$DTIT1"
TIT2="$DTIT2"
COPY="$DCOPY"
FONT1="$DFONT1"
FONT2="$DFONT2"
FONT="$DFONT"
CCFONT="$DCCFONT"
ICONOS="$DICONOS"
ANCHO="$DANCHO"
POS1="$DPOS1"
POS2="$DPOS2"
POSCOPY="$DPOSCOPY"
SOMBRA="$DSOMBRA"
BORDE="$DBORDE"
COLOR="$DCOLOR"
TINTA="$DTINTA"
FILETE="$DFILETE"
FCOLOR="$DFCOLOR"
TIPOSOMBRA="$DTIPOSOMBRA"
PROGRESO=0
GAUGE=""
# Array para traducir los valores numéricos 1-6 a las posiciones que
# hay que pasar a imagemagick con el parámetro gravity
POSICIONES=( "" west center east)
COLORSPACES=( gray gray rgb )
macrotit() ## Resuelve las macros de los tÃtulos
{
local inicio resto1 resto result
if [ ! -z "$1" ]; then
inicio="${1%%\%*}"
resto1="${1:$(( ${#inicio} + 1 )):1}"
resto="${1:$(( ${#inicio} + 2 ))}"
case $resto1 in
F ) # Nombre del fichero
result="$(basename "$2")"
;;
f ) # Nombre del fichero sin extensión
result="$(basename "$2" ".${2##*.}")"
;;
d ) # Fecha de disparo, o si no existe del fichero
result="$(exiftool -d "%x %X" -DateTimeOriginal -S -s "$2")"
if [ -z "$result" ]; then
result="$(date -r "$2" "+%x %X")"
fi
;;
D ) # Fecha del fichero
result="$(date -r "$2" "+%x %X")"
;;
s ) # Velocidad del obturador
result="$(exiftool -S -s -ShutterSpeed "$2")"
;;
a ) # Apertura del diafragma
result="$(exiftool -Aperture -S -s "$2")"
;;
l ) # Longitud focal de la lente
result="$(exiftool -FocalLength -S -s "$2")"
;;
L ) # Longitud focal equivalente en 35mm (o si no se puede obtener, la real)
result="$(exiftool -FocalLengthIn35mmFormat -S -s "$2")"
if [ -z "$result" ]; then
result="$(exiftool -FocalLength -S -s "$2")"
fi
;;
c ) # Comentario de usuario
result="$(exiftool -UserComment -S -s "$2")"
;;
C ) # Comentario de usuario, o si no existe, nombre del fichero
result="$(exiftool -UserComment -S -s "$2")"
if [ -z "$result" ]; then
result="$(basename "$2")"
fi
;;
* )
result="$resto1"
;;
esac
## Se podrÃa hacer de otra forma pero preferà la recursividad
## La funcion resuelve el primer % y luego se llama a si misma con
## el resto hasta que el resto es la cadena vacÃa.
echo -n "${inicio}${result}$(macrotit "${resto}" "$2")"
fi
}
# Preparamos el asunto del directorio temporal y ponemos un trap para borrarlo
# tanto si finaliza correctamente como si se produce un error.
DIRTEMP="$(mktemp -d -p "${TMP:-/tmp}" marcoXXXXXXX)" \
&& trap 'rm -rf "$DIRTEMP"' SIGINT SIGTERM SIGQUIT EXIT \
|| { echo 'Error creando directorio temporal' >&2; exit 1; }
while [ $# -gt 0 ]; do
PARAM="$1"
case "$PARAM" in
"--help"|--usage|-h)
echo ""
echo "Uso:"
echo ""
echo " $0 --help|--usage|-h Muestra esta ayuda"
echo " $0 [opciones] img-1 [... img-n] [... [opciones] img-n1 [... img-nn]]"
echo ""
cat <<FINDETEXTO
opciones disponibles:
--tamanomarco|-g Ancho del marco en pixels.
--titulo1|-t1 "Puede haber hasta 2 tÃtulos (t1 y t2)"
--titulo2|-t2 "t2 por defecto es la fecha de disparo"
En los tÃtulo se pueden usar las siguentes macros:
%F Nombre del fichero
%f Nombre del fichero sin extensión
%d Fecha de disparo, o si no existe del fichero
%D Fecha del fichero
%s Velocidad del obturador
%a Apertura del diafragma.
%l Longitud focal de la lente.
%L Longitud focal equivalente en 35mm
(o si no se puede obtener, la real).
%c Comentario de usuario.
%C Comentario de usuario, o si no existe,
nombre del fichero.
--copyright|-m "Mensaje de copyright que aparece a la derecha"
--iconos|-I Iconos previos al mensaje de copyright:
c=(CC), a=SA, b= BY, f=(=), n=NC, m=Sampling,
s=Share, p=PD r=Remix, C:Logo CC
para dejar un espacio pequeño entre sÃmbolos
usar ',', para espacio mayor ' ', por ejemplo:
-i "c b,a"
--font3|-f Estilo de letra o fichero de fuente .ttf para mensaje
de copyright
--font1|-f1 Fuente para el tÃtulo1
--font2|-f2 Fuente para el titulo2 (por defecto la misma que tÃtulo1)
--tamano|-s Tamaño de la letra en puntos para copyright
--tamano1|-s1 Tamaño de letra para tÃtulo1 (por defecto = tÃtulo)
--tamano2|-s2 Tamaño de letra para tÃtulo2 (por defecto = tÃtulo)
--ptitulo1|-p1 Posición para tÃtulo1 (Por defecto 2)
--ptitulo2|-p2 Posición para tÃtulo2 (Por defecto 1)
--pcopy|-q Posición para copyright (Por defecto 3)
Las posicioones posibles son:
1 - izquierda
2 - centrado
3 - derecha
--borde|-b Tamaño del borde
--sombra|-o Tamaño de la sombra
--color|-c Color del borde
--fcolor|-r Color del filete
--tinta|-i Color del texto
--[con/sin]filete Activar o desactivar poner un reborde fino
alrededor de la foto
--sombra[normal/opaca/color] Tipo de sombra
FINDETEXTO
exit 0
;;
"--titulo"|"-t")
shift
TIT1="${1:-$DTIT1}"
;;
"--titulo1"|"-t1")
shift
TIT1="${1:-$DTIT1}"
;;
"--titulo2"|"-t2")
shift
TIT2="${1:-$DTIT2}"
;;
"--copyright"|"-m")
shift
COPY="${1:-$DCOPY}"
;;
"--iconos"|"-I")
shift
ICONOS="${1:-$DICONOS}"
;;
"--font"|"-f")
shift
FONT="${1:-$DFONT}"
;;
"--font1"|"-f1")
shift
FONT1="${1:-$DFONT1}"
;;
"--font2"|"-f2")
shift
FONT2="${1:-$DFONT2}"
;;
"--tamano"|"-s")
shift
TAMANO="${1:-$DTAMANO}"
;;
"--tamano1"|"-s1")
shift
TAMANO1="${1:-$DTAMANO1}"
;;
"--tamano2"|"-s2")
shift
TAMANO2="${1:-$DTAMANO2}"
;;
"--borde"|"-b")
shift
BORDE="${1:-$DBORDE}"
;;
"--sombra"|"-o")
shift
SOMBRA="${1:-$DSOMBRA}"
;;
"--tinta"|"-i")
shift
TINTA="${1:-$DTINTA}"
;;
"--color"|"-c")
shift
COLOR="${1:-$DCOLOR}"
;;
"--fcolor"|"-r")
shift
FCOLOR="${1:-$DFCOLOR}"
;;
"--ptitulo1"|"-p1")
shift
if [ "$(( $1 ))" -gt 0 -a "$(( $1 ))" -le 3 ]; then
POS1="${POSICIONES[$1]}"
fi
;;
"--ptitulo2"|"-p2")
shift
if [ "$(( $1 ))" -gt 0 -a "$(( $1 ))" -le 3 ]; then
POS2="${POSICIONES[$1]}"
fi
;;
"--pcopy"|"-q")
shift
if [ "$(( $1 ))" -gt 0 -a "$(( $1 ))" -le 3 ]; then
POSCOPY="${POSICIONES[$1]}"
fi
;;
"--tamanomarco"|"-g")
shift
MARCO="${1:-$DMARCO}"
;;
"--confilete"|"--filete")
CONFILETE="1"
;;
"--sinfilete")
CONFILETE="0"
;;
"--sombranormal")
TIPOSOMBRA="0"
;;
"--sombraopaca")
TIPOSOMBRA="1"
;;
"--sombracolor")
TIPOSOMBRA="2"
;;
"--gauge")
GAUGE="YES"
;;
*)
if [ -f "$PARAM" ]; then
IN="$PARAM"
OUT="$(dirname "$PARAM")/${PREFIJO}$(basename "$PARAM")"
imageSize="$(identify -format "%w %h" "$IN")"
imageX="${imageSize%% *}"
imageY="${imageSize##* }"
if [ $imageX -gt $imageY ]; then MAXsize=imageX; else MAXsize=imageY; fi
if (( MARCO < 1 )); then
MARCO="$(( MAXsize/25+1 ))"
fi
if (( BORDE < 1 )); then
BORDE="$DBORDE"
fi
if (( SOMBRA <= 1 )); then
SOMBRA="$DSOMBRA"
fi
if (( TAMANO < 1 )); then
TAMANO="$((MARCO/3+1))"
fi
if (( TAMANO1 < 1 )); then
TAMANO1="$((MARCO/2+1))"
fi
if (( TAMANO2 < 1 )); then
TAMANO2="$((MARCO/3+1))"
fi
MTIT1=$(macrotit "$TIT1" "$IN")
MTIT2=$(macrotit "$TIT2" "$IN")
if [ ! -z $GAUGE ]; then
((PROGRESO++));
else
echo "Procesando fichero $1 -> $OUT"
fi
# Generamos la sombra y el borde
# convert \
# "$IN" -modulate $(( 80 - 40*(TIPOSOMBRA == 2),120 )) \
# -fill "gray25" -colorize "$((100*(TIPOSOMBRA==1)+20*(TIPOSOMBRA==2)+60*(TIPOSOMBRA==0)))"% \
# -colorspace ${COLORSPACES[$TIPOSOMBRA]} \
# -channel RGBA \
# -bordercolor "$COLOR" \
# -border "$(( SOMBRA*2 ))x$(( SOMBRA*2 ))" \
# -blur "$((10*SOMBRA))x$(((SOMBRA+1)/2))" \
# -shave "${SOMBRA}x${SOMBRA}" \
# -gravity northwest -bordercolor "$COLOR" -border "${BORDE}x${BORDE}" \
# -gravity southeast \
# -crop "+$(( SOMBRA*2 ))+$(( SOMBRA*2 ))" \
# "${DIRTEMP}/tmp.miff"
convert \
"$IN" -modulate $(( 80 - 40*(TIPOSOMBRA == 2),120 )) \
-fill "gray25" -colorize "$((100*(TIPOSOMBRA==1)+50*(TIPOSOMBRA==2)+60*(TIPOSOMBRA==0)))"% \
-colorspace ${COLORSPACES[$TIPOSOMBRA]} \
-channel RGBA \
-bordercolor "$COLOR" \
-border "$(( SOMBRA*2 ))x$(( SOMBRA*2 ))" \
-blur "$((10*SOMBRA))x$(((SOMBRA+1)/2))" \
-shave "${SOMBRA}x${SOMBRA}" \
-gravity northwest -bordercolor "$COLOR" -border "$(( BORDE+5 ))x$(( BORDE ))" \
-gravity southeast \
-crop "+$(( SOMBRA*2 ))+$(( SOMBRA*2 ))" \
"${DIRTEMP}/tmp.miff"
# hacemos los tÃtulos en fondo transparente
convert -size "${imageX}x${MARCO}" xc:"$COLOR" -fill "$TINTA" \
-gravity "$POS2" -font "$FONT2" -pointsize "$TAMANO2" -draw "text 0,0 '$MTIT2'" \
-gravity "$POS1" -font "$FONT1" -pointsize "$TAMANO1" -draw "text 0,0 '$MTIT1'" \
"${DIRTEMP}/textos.miff"
convert -size 0x0 xc:"$COLOR" -background "$COLOR" \
-fill "$TINTA" -pointsize "$(( TAMANO * 100 / 75 ))" \
-font "$CCFONT" label:"$ICONOS" \
-font "$FONT" -pointsize "$TAMANO" \
label:"$COPY" +append \
"${DIRTEMP}/textos2.miff"
convert -composite -gravity "$POSCOPY" "${DIRTEMP}/textos.miff" "${DIRTEMP}/textos2.miff" -bordercolor "$COLOR" -border "${BORDE}x0" "${DIRTEMP}/textos3.miff"
# Añadimos el borde inferior con los textos
convert -background "$COLOR" -gravity center "${DIRTEMP}/tmp.miff" "${DIRTEMP}/textos3.miff" -append "${DIRTEMP}/tmp2.miff"
# Ponemos la imágen original encima
if [ "$CONFILETE" == "1" ]; then
convert "$IN" -bordercolor $FCOLOR -border "$FILETE" "${DIRTEMP}/tmp3.miff"
composite -gravity northwest -geometry "+$(( BORDE - FILETE ))+$(( BORDE - FILETE ))" \
"${DIRTEMP}/tmp3.miff" "${DIRTEMP}/tmp2.miff" "$OUT"
else
composite -gravity northwest -geometry "+${BORDE}+${BORDE}" \
"$IN" "${DIRTEMP}/tmp2.miff" "$OUT"
fi
# Descomentar las dos lÃneas siguientes para obtener una copia de los ficheros temporales antes de borrarlos
# cp -f "${DIRTEMP}/tmp.miff" "$OUT-tmp.miff"
# cp -f "${DIRTEMP}/tmp2.miff" "$OUT-tmp2.miff"
# cp -f "${DIRTEMP}/textos.miff" "$OUT-textos.miff"
# cp -f "${DIRTEMP}/textos2.miff" "$OUT-textos2.miff"
# cp -f "${DIRTEMP}/textos3.miff" "$OUT-textos3.miff"
else
echo "$1 : parámetro o nombre de fichero incorrecto. Use -h para ayuda"
fi
;;
esac
shift
if [ $PROGRESO -gt 0 ]; then
echo $(( (PROGRESO * 100) / (PROGRESO + $# ) ))" % Completado"
fi
done
Voy un poco liado estos días y en casa apenas conecto.