lunes, 20 de octubre de 2014

ImageMagick: automatiza la edición de imágenes desde consola



Tengo un trabajo en papel de unas 300 páginas que quiero pasar a formato digital. Digamos que quiero simplemente escanearlo, convertirlo en un PDF.

Lo que he hecho es hacer un soporte de baja tecnología para mi móvil y sacar fotos a todas las páginas del trabajo. Es por no escanearlo, que me tardaría muchísimo tiempo.

Con el soporte me aseguro que todas las fotos quedan a igual distancia, con la misma resolución, con el mismo enfoque, idénticamente encuadradas,...

Ahora que ya tengo todas las imágenes, lo que quiero es recortarlas todas para quitar lo que no es la hoja, es decir, la mesa sobre la que apoyo el trabajo.

Luego de quitar ese borde exterior, quiero partir cada imagen en dos, una para la página de la izquierda y otra para la página de la derecha.

Y me voy a lanzar con ImageMagick, y de un plumazo hacerlo con todas las imágenes.
Sé que me va a costar comprender el manejo de esta potentísima herramienta de consola, pero una vez la domine, escanear trabajos en papel va a ser coser y cantar.


Digamos que tengo algo así, un trabajo encuadernado, y quiero pasarlo a PDF:




1. Soporte para el móvil de baja tecnología

Yo me he basado en este que hay en instructables.com:



De forma muy rápida, iré pasando página a página y sacándole fotos.


2. Descargamos ImageMagick

Desde consola, sudo apt-get install imagemagick:


3. Recortar un cuadrado dentro de la imagen

Al sacar la foto del trabajo, hay una parte de la foto que deseo desechar, y quedarme solo con un cuadrado que se correponde con la foto del trabajo abierto.

Con el comando -crop de imagemagick recorto la sección que me interesa. Primero recortaré la hoja de la izquierda y luego la hoja de la derecha.




¿Cómo hago ese recorte?
convert -crop 1000x1500+850+803\! *.jpg img%03d_a.jpg

y luego
convert -crop 1000x1500+1700+803\! *.jpg img%03d_b.jpg

Veamos por partes qué hace el comando:

  • -crop, indico a imagemagick que lo que quiero es cortar un recuadro de la imagen.
  • 1000x1500, es el ancho y el alto del recuadro que quiero recortar.
  • +850+803, coordenadas de la esquina superior derecha de ese recuadro que me interesa.
  • *.jpg todas las imágenes de la carpeta, que son todas las fotos del trabajo que estoy "escaneando".
  • img%03d_a.jpg, nombre de los ficheros de salida. Todos los ficheros se llamarán img000_a.jpg, img001_a.jpg, img002_a.jpg,... Con %03d lo que consigo es que cree una secuencia numérica de 3 dígitos, comenzando en 000. Le añado la _a al final, para así que me queden consecutivos la página de la izquierda con la de la derecha. Las páginas de la derecha serán img000_b.jpg, img001_b.jpg, img002_b.jpg,...


4. Rotar un mogollón de imágenes


Ya me ha pasado que saco las fotos rotadas. Pues las corrijo todas de un plumazo:

convert -rotate 270 *.jpg img%03d.jpg


5. Convertir imágenes a pdf

Al final tengo como unas 200 imágenes ya rotadas y recortadas, ordenadas de forma secuencial y con la terminación _a ó _b según sea una página de la izquierda o de la derecha del trabajo original. Ahora quiero tomar todas esas imágenes y convertirlas en un fichero pdf.

Eso imagemagick lo hace muy fácilmente:
convert *.jpg libro.pdf





Algunos errores que te pueden ocurrir



ERROR 1. Me da error convirtiendo imágenes a PDF

convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.



Abrimos el fichero /etc/ImageMagick-6/policy.xml
y buscamos la línea que pone <policy domain="coder" rights="none" pattern="PDF" />
y la cambiamos por <policy domain="coder" rights="read|write" pattern="PDF" />