Etiquetas

555 74HC04 74HC14 74HC165 74LS04 acentos ADC10 Amstrad archivo arduino aristóteles armbian array ass at backup base64 bash Basho bc beethoven Biblia blog bucle c c++ c++11 c++17 C005 cadena Carmina Burana casting CD4017 CD4040 Cine clases Colores connect Consolación a Helvia Consolación a Marcia Consolación a Polibio constante corsair CPC Cristal 32Khz css cursor mouse cut daemon date dead keys Debian directorio disco duro DS32kHz electricidad Electrónica ensamblador entryList epicureismo Estadística estoicismo felicidad ffmpeg filePath filosofia Filosofía firefox flac for fstab funcion Gargantúa gastronomía gilgamesh Ginott gmp gpt grep gtts Hobbes hotkeys html imagemagick inline Javascript kde kernel modulos latex ldr lib-notify Linux Literatura ludoteca macro mapa de bits Matroska mega Microsoft Word Milan Kundera mkvextract mkvinfo mount mp3 mplayer MSP430 msp430F5529 MSP432 Multimedia Musica oop orange_pi pato PIR PL9823 Platón poesía POO en C++ pulseaudio puntero PWM pygame pyqt python QAction qApp QApplication QByteArray QDialog Qdir QFile QFileDialog QImage qlabel QList QListWidget QMessagebox QMouseEvent qpainter QPalette QPixmap QProcess QRegularExpression QRegularExpressionMatchIterator QString QStringList Qt qt5 QToolbar quijote QVector qwidget R Rabelais ratón relé Resonador cerámico samba San Agustín screen Séneca signal slot smart smartctl sox srt static const stdarg.h subtítulos Symbian tar teléfonos móviles temperatura temperatura cpu Temporizador tesseract Timer timestamp Trigonometría tts tutorial uid unicode user USI va_arg va_end va_list va_start velocidad ventilador Voltaire wallpaper xboxdrv xinput xrandr Z80 zip

miércoles, mayo 21, 2014

Creando wallpapers en doble pantalla con bash e imagemagick

1. Descripción de las pantallas
  • Pantalla principal: 22 pulgadas, 1920x1080.
  • Pantalla secundaria: 19 pulgadas, 1440x900.
  • Físicamente la pantalla secundaria esta 1cm por debajo de la principal.
  • La densidad de pixels de ambas pantallas es diferente, por lo que hay que hacer algunos cálculos para que las imágenes encajen.
2. Cálculo del tamaño de las imágenes.
  • La pantalla de 22 pulgadas, 1920x1080 tiene un tamaño de 477mm x 269 mm (4 pixels por mm)
  • La pantalla de 19 pulgadas, 1440x900 mide 408mm x 255mm (3.5 pixels por mm)
  • Para se vea bien la imagen de la pantalla de 19 pulgadas debe medir:
  •  (1440 * 4 / 3.5) x (900 * 4 / 3.5)

3. Descripción del proceso
  • La imagen original es de 16 megapixels (4608x3456)
  • Editar la imagen con gimp y recortarla con una proporción fija de 3360x1180. (1920+1440 de ancho y 1080 más 100 pixels de margen).
  • Exportarla como TIFF para evitar pérdidas por compresión.
  • Editar las variables del script según convenga. El resultado son dos imágenes (1920x1080 y 1440x900) que encajan una con la otra.

Nota: El script no está optimizado para que sea más fácil de entender y modificar.

#!/bin/bash

################################################
### Variables que siempre hay que modificar  ###

# RECUERDA: La imagen a recortar es con la proporción 3360:1080
FILENAME="pic04.tiff"

#Ajuste de la imagen de la pantalla 1 para que encaje con la
#de la pantalla 2. 
SCR1_OFFSET="60"

### Variables que tal vez haya que modificar ###

# El añadido al alto real
VIRTUAL_EXPANSION="100"

#Tamaño real de las pantallas
SCR1_WIDTH="1920"
SCR1_HEIGHT="1080"

# La pantalla es 1440x900 pero al tener diferente
# dpi hago un ajuste en el tamaño de la imagen
SCR2_WIDTH="1646"
SCR2_HEIGHT="1029"
#SCR2_WIDTH="1440"
#SCR2_HEIGHT="900"


## A partir de aquí ya no hay que modificar nada ##
###################################################

#Tamaño virtual de las pantallas
#Asumo que la pantalla 1 siempre es mayor que la 2
let "VIRTUAL_HEIGHT=$SCR1_HEIGHT+$VIRTUAL_EXPANSION"

TEMP_FILE1A="/tmp/1920x1080_tmpa.tiff"
TEMP_FILE2A="/tmp/1440x900_tmpa.tiff"

TEMP_FILE1B="/tmp/1920x1080_tmpb.tiff"
TEMP_FILE2B="/tmp/1440x900_tmpb.tiff"

#TEMP_FILE1C no es necesario
TEMP_FILE2C="/tmp/1440x900_tmpc.tiff"

FINAL_FILE1="/tmp/1920x1080.jpg"
FINAL_FILE2="/tmp/1440x900.jpg"


#Calcular tamaño total del escritori
let "VIRTUAL_WIDTH=$SCR1_WIDTH+$SCR2_WIDTH"

echo -e "Obteniendo el tamaño de la imagen..."

# Averiguar tamaño de la imagen
IMG_WIDTH=`identify $FILENAME | cut -d ' ' -f3 | cut -d 'x' -f1`
IMG_HEIGHT=`identify $FILENAME | cut -d ' ' -f3 | cut -d 'x' -f2`


# Calcular proporcion del escritorio respecto de la imagen
# Usando bc para obtener un resultado con decimales
PROPORTION=`bc <<< "scale=10; $IMG_WIDTH/$VIRTUAL_WIDTH"`


#Calculo del tamaño de los recortes teniendo en cuenta la proporción
#El resultado es un entero por la extraña operación añadida
W1_WIDTH=`bc <<< "($SCR1_WIDTH*$PROPORTION+0.5)/1"`
W2_WIDTH=`bc <<< "($SCR2_WIDTH*$PROPORTION+0.5)/1"`

W1_HEIGHT=`bc <<< "($VIRTUAL_HEIGHT*$PROPORTION+0.5)/1"`

echo -e "Preparando imágenes..."

#cortar imagenes
convert ${FILENAME} -crop ${W1_WIDTH}x${W1_HEIGHT}+0+${IMG1_OFFSET} ${TEMP_FILE1A}
convert ${FILENAME} -crop ${W2_WIDTH}x${W1_HEIGHT}+${W1_WIDTH}+${IMG2_OFFSET} ${TEMP_FILE2A}

echo -e "Redimensionando imágenes..."

#redimensionar
convert ${TEMP_FILE1A} -resize ${SCR1_WIDTH}x${VIRTUAL_HEIGHT} ${TEMP_FILE1B}
convert ${TEMP_FILE2A} -resize ${SCR2_WIDTH}x${VIRTUAL_HEIGHT} ${TEMP_FILE2B}

echo -e "Guardando imágenes..."

#Recorte final
let "SCR1_SOBRANTE=${VIRTUAL_EXPANSION}-${SCR1_OFFSET}"
convert ${TEMP_FILE1B} -crop ${SCR1_WIDTH}x${SCR1_HEIGHT}+0+${SCR1_SOBRANTE} $FINAL_FILE1

let "SCR2_SOBRANTE=$VIRTUAL_HEIGHT-$SCR2_HEIGHT"
convert ${TEMP_FILE2B} +repage -crop ${SCR2_WIDTH}x${SCR2_HEIGHT}+0+${SCR2_SOBRANTE} ${TEMP_FILE2C} 

#redimensionado final en la segunda pantalla
convert ${TEMP_FILE2C} -resize 1440x900\! ${FINAL_FILE2}

echo -e "\nSumario:"
echo -e "DATOS DE LA IMAGEN"
echo -e "El ancho es $IMG_WIDTH"
echo -e "El alto es $IMG_HEIGHT"
echo
echo -e "DATOS DEL ESCRITORIO"
echo -e "Ancho total: $VIRTUAL_WIDTH"
echo -e "Proporción entre la imagen y el escritorio: $PROPORTION"
echo
echo -e "Terminado."

No hay comentarios: