Redimensionar y adaptar las imágenes

Una vez escaneadas/extraídas las imágenes y eliminados los bordes de las mismas, debemos redimensionarlas al tamaño más adecuado para nuestro dispositivo y convertirlas al formato más adecuado.


Redimensión de las imágenes

Para dispositivos bq Avant XL de 1024x768 píxeles (9"):

$ cp -pr cm-spectrum copia-cmspectrum_preredim
$ cd cm-spectrum
$ export ANCHO="768"
$ export ALTO="1024"
$ export CALIDAD="80"
$ export OPCIONES=""
$ find . -maxdepth 1 -type f -name "*.jpg" | sort | while read FICH; 
  do
     convert "$FICH" -quality $CALIDAD -resize ${ANCHO}x${ALTO} $OPCIONES "$FICH"
  done

En el caso de dispositivos de 800x600 píxeles (6"):

$ export ANCHO="600"
$ export ALTO="800"
$ export CALIDAD="80"
$ export OPCIONES=""
$ find . -maxdepth 1 -type f -name "*.jpg" | sort | while read FICH; 
  do
     convert "$FICH" -quality $CALIDAD -resize ${ANCHO}x${ALTO} $OPCIONES "$FICH"
  done

La redimensión respetará la proporción de aspecto entre el ANCHO y el ALTO, por lo que es posible que acabemos teniendo imágenes de, por ejemplo, 1024x690 o 1010x768. Esto evita que las imágenes pierdan su relación de aspecto y por tanto se deformen ligeramente las formas (círculos que se achatan, personajes que se hacen ligeramente más anchos o más altos…).

Por contra, si mantenemos la relacion de aspecto y no obtenemos imágenes de exactamente el tamaño de nuestro dispositivo estaremos perdiendo área de visualización en el mismo y por tanto "definición" en el contenido (que podría ocupar más píxeles). Si no queremos mantener la relación de aspecto, basta con agregar el símbolo admiración cerrada (!) después del valor de ALTO, para que convert ignore el aspect ratio en ese campo:

$ find . -maxdepth 1 -type f -name "*.jpg" | sort | while read FICH; 
  do
    convert "$FICH" -quality $CALIDAD -resize ${ANCHO}x${ALTO}! $OPCIONES "$FICH"
  done

De esta forma, con el código de arriba las imágenes tendrán siempre exáctamente 1024x768 píxeles (u 800x600 si así lo establecemos).

Por otra parte, el valor del parámetro "CALIDAD" debemos establecerlo de forma que se reduzca el fichero de imagen resultante pero el PDF definitivo siga siendo perfectamente legible en el lector. Para eso, podemos probar con diferentes valores, siendo los valores estándar 70, 75, 80, 85 o 90.

En el caso de convertir a PNG, el parametro CALIDAD varía de 0 a 10 (no de 0 a 100), siendo 10 la mayor calidad (y menor compresión).


Rotación / inversión de imágenes

Durante el proceso de redimensión de las imágenes podemos aprovecha para rotarlas si es necesario (añadiendo a los flags de convert -rotate 180) o invertirlas verticalmente (-flip) u horizontalmente (-flop).


Modificación del contraste

Al escanear los ebooks en un espacio de color RGB, es posible que las marcadas líneas negras de un cómic o libro se conviertan en diferentes tonos de grises, por el proceso de escaneado en sí y por la codificación de la imagen. Por otra parte, los colores blancos no son puros, sino que son diferentes tonalidades cercanas al blanco.

Este hecho (negros que son grises y blancos que no son blancos) puede provocar que el libro/comic no se vea perfectamente en nuestro ebook, especialmente debido a que los grises se marcan "poco" en la pantalla de tinta electrónica de 8 ó 16 tonos de gris, y puede hacer los textos o las letras ilegibles.


 Grises y blancos

Negros que son grises y "puntos con tonos de blancos" sobre el fondo blanco


Utilizando un editor de imágenes como The GIMP (o Photoshop) podemos ajustar las curvas de la imagen (Botón derecho → Colores → Curvas) "remarcando" los negros (llevando hacia la derecha la parte baja de la curva) y "homogeneizando" los blancos (llevando ligeramente hacia la izquierda la parte alta de la curva).

El resultado es el siguiente:


 Ajustando curvas

Esto es un proceso manual y nuestro objetivo debería ser aplicar este tipo de efecto mediante convert, para poder añadirlo durante el proceso de recorte / redimensionado / conversión.

La mejor opción es la de subir el contraste con la opción "-contrast-stretch VALOR%":


  • convert in.jpg -contrast-stretch 5% out.jpg


Podemos probar con valores entre el 1 y el 10%.

Otras opciones que menos efecto (pero que podemos poner simultáneamente con -contrast-stretch) son:


  • Función de alteración exponencial:

    convert in.jpg -fx '(1/(1+exp(10*(.5-u)))-0.0066928509)*1.0092503' out.jpg

  • Aumentar el contraste manualmente:

    convert in.jpg -contrast -contrast -contrast out.jpg

  • Normalización de colores:

    convert in.jpg -normalize out.jpg

  • Alteración del contraste:

    convert in.jpg -sigmoidal-contrast 10,50% out.jpg

  • Niveles automáticos de color:

    convert in.jpg -auto-level out.jpg



Más información en http://www.imagemagick.org/Usage/color_mods/


La aplicación del efecto de contraste debe de realizarse durante el convert de redimensionado, añadiendo los flags al bucle que hemos visto en el apartado Redimensión de las imágenes.

El resultado del efecto (-contrast-stretch 5% en este caso) es que en nuestro ebook las letras son negras, mucho más "remarcadas":


 Antes y después del efecto de contraste


Conversión de las imágenes

Como paso final del proceso de tratamiento de imágenes, tenemos que decidirnos entre el formato JPG y el PNG para el almacenamiento de cada imágen, ya en un directorio de imágenes, o para su posterior conversioń a PDF/CBR/CZ.

La selección de JPG o PNG y el tipo dependerá del nivel de compresión, del tipo de imagen (si es a color o blanco y negro), el número de colores de la imagen y que soporte nuestro dispositivo, etc.

La decisión debe de tomarse entre estas 3 opciones:


  • Dejar la imagen en JPG, teniendo únicamente "-quality 0/100" como parámetro para determinar el tamaño y calidad de la imagen final resultante).
  • Convertir la imagen a PNG "indexado", con una paleta de 32, 16, 8 ó 4 niveles de color según el dispositivo que tengamos.
  • Convertir la imagen a PNG blanco y negro (2 niveles de color). Esto es lo menos habitual porque se pierde el "aliasing" de grises obtenido tras el escaneo y en el ajuste de las curvas.


Para las primera opción no hay que modificar lo que ya hemos visto: basta con especificar un -quality" adecuado a nuestras necesidades.

Para las otras 2 opciones, a continuación se muestran los flags que permiten a convert grabar una imagen individual JPG/PPM/PBM como una imagen en una imagen indexada o monocromo.


  • Convertir imagen a 256 colores:

    convert input.jpg -depth 8 -colors 256 -type Palette output.png
  • Convertir imagen a 16 colores:

    convert input.jpg -depth 8 -colors 16 -type Palette output.png
  • Convertir imagen a blanco y negro:

    convert input.jpg -depth 8 -colors 256 -type BiLevel output.png


Para determinar cuál de las opciones es la mejor para nuestro libro o cómic, lo ideal es probar los 3 métodos sobre un par de ficheros origen y ver los tamaños y calidades de los diferentes resultados.

Si no tenemos problemas de espacio podemos optar por el simple JPG con valores > 80 de "-quality". Para ahorrar espacio (y dejar las imágenes hasta a la mitad en algunos casos) podemos usar PNG con 16 colores si nuestro ebook tiene 16 niveles de gris.

Una vez seleccionado el formato, se aconseja incluir las opciones definitivas de conversión en el convert que realiza el redimensionado (añadiendo, por ejemplo -depth 8 -colors 16 -type Palette antes del nombre del fichero de salida) y cualquier otro efecto, para así aplicarlo todo de forma simultanea y no repetir el procesado de todas las imágenes para cada acción deseada.

Por ejemplo, para convertir a PNG de 16 colores nastará con modificar la variable "OPCIONES" y añadir el sufijo ".png" al nombre de salida:

$ export ANCHO="768"
$ export ALTO="1024"
$ export CALIDAD="8"
$ export OPCIONES="-colors 16 -type Palette"
$ find . -type f -name "*.jpg" | sort | while read FICH; 
  do
     convert "$FICH" -quality $CALIDAD -resize ${ANCHO}x${ALTO}! $OPCIONES "$FICH".png
  done

De hecho, lo ideal sería realizar todos los pasos de la conversión de una misma pasada, incluído el recorte:

export MARGENX="20"
export MARGENY="20"
export ANCHO="768"
export ALTO="1024"
export CALIDAD="80"
export OPCIONES=""
mkdir out
find . -maxdepth 1 -type f -name "*.jpg" | sort | while read FICH; 
do
   convert "$FICH" -shave ${MARGENX}x${MARGENY}+0+0 \
                   -quality $CALIDAD \
                   -resize ${ANCHO}x${ALTO}! \
                   $OPCIONES out/"$FICH"
done

NOTA: Podemos quitar el "-maxdepth 1" y el "out/" para hacer la conversión recursivamente no sólo en el directorio actual sino en todos los subdirectorios, para, por ejemplo, convertir una colección completa. Nótese que esto sobreescribiría los ficheros originales.

El orden de las acciones sobre el fichero de salida es importante. Por ejemplo, tenemos que hacer el "shave" antes del "resize" para que el recorte de los bordes se haga sobre la imagen antes de recortar y no después, ya que si no obtendríamos imágenes de menor tamaño que el $ANCHO x $ALTO especificados.




<Anterior paso: Recortar márgenes> - Siguiente Paso: Convertir imágenes a <PDF> / <EPUB> / <CBR/CBZ>



<Volver a la sección de Ebooks>