GNU/Linux >> Tutoriales Linux >  >> Linux

Automatice el procesamiento de imágenes con este script Bash

Los escritores no solo trabajan con palabras, a menudo tienen que trabajar con imágenes. La escritura técnica implica presentar muchas capturas de pantalla para transmitir la tecnología y los procesos. Las diferentes plataformas de publicación pueden tener varios requisitos para las imágenes, como el formato de la imagen o el tamaño del archivo.

Como consultor de TI e ingeniero de sistemas, he escrito mucha documentación técnica como entregas a clientes, generalmente con Microsoft Word (.doc) como formato requerido. Cualquier documento puede crecer rápidamente a medida que se agrega contenido. Al principio, las capturas de pantalla solían ser mapas de bits (.bmp), que pueden tener un tamaño de archivo muy grande. Un documento que describa la instalación de un sistema operativo en un servidor podría terminar siendo un archivo muy grande.

Reducir el tamaño de las imágenes sin hacerlas ilegibles fue un ejercicio laborioso. Los mapas de bits se pueden convertir a archivos jpeg y posteriormente a archivos png. La edición siguió siendo un desafío incluso más tarde, cuando cambié mi paquete de oficina a LibreOffice. Afortunadamente, la mayoría de las herramientas de captura de pantalla actuales se guardan en formatos más pequeños, como png.

Opensource.com pone ciertos límites a las imágenes que se utilizan en sus artículos. Desarrollé un método rápido de tres pasos para preparar imágenes para mis artículos. El primer paso es ser inteligente con la puesta en escena, como cambiar el tamaño de una ventana o cambiar una fuente. Dos pasos adicionales se volvieron muy repetitivos. Son para garantizar que la imagen no supere el límite de ancho de 600 píxeles y para aplicar un borde.

Más recursos de Linux

  • Hoja de trucos de los comandos de Linux
  • Hoja de trucos de comandos avanzados de Linux
  • Curso en línea gratuito:Descripción general técnica de RHEL
  • Hoja de trucos de red de Linux
  • Hoja de trucos de SELinux
  • Hoja de trucos de los comandos comunes de Linux
  • ¿Qué son los contenedores de Linux?
  • Nuestros últimos artículos sobre Linux

La secuencia de comandos prepimg.sh

Escribí un script Bash llamado prepimg.sh para manejar estas tareas. Este script utiliza dos herramientas de la suite ImageMagick.

Cambiar el tamaño de la imagen

La utilidad de captura de pantalla guarda la imagen en Pictures directorio con un nombre genérico, algo así como Screenshot-20210923222312.png . Mi prepimg.sh El script verifica el ancho de píxeles de los archivos en este directorio y cambia el tamaño de cualquiera que exceda el límite. Este paso utiliza el identificar programa de la suite ImageMagick para determinar el ancho (%w).

$ identify -format %w Screenshot-20210903202655.png
1217

El valor de ancho se asigna a la variable W para usar como comparador hasta el límite de 600. El límite en sí es configurable a través de la variable $MAXWIDTH . Si se determina que el ancho excede MAXWIDTH, entonces otro programa ImageMagick llamado convert se llama para reducir el ancho de la imagen. Aquí está la función de procesamiento de imágenes de mi script:

     if [ "$W" -gt "$MAXWIDTH" ]
     then
         [[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
         convert -resize "${MAXWIDTH}" \
                 "${SCREENSHOTS}"/"${1}" \
                 "${READY}"/"${1}"
     
     ...    

La imagen se reduce de tamaño según sea necesario y se guarda en un directorio diferente definido por $READY variable. En este caso, la imagen se redimensiona un poco más pequeña (598 píxeles) para dejar espacio para agregar un borde, que muestro a continuación.

Añadir un borde a la imagen

A veces puede parecer que una imagen se mezcla con el fondo de la página web. Esto se debe a que el color de primer plano de la imagen hasta el borde es el mismo color que el fondo del sitio. Aquí hay un ejemplo:

Como puede ver en la imagen de arriba, es imposible saber dónde está el borde de la imagen. Este problema no se limita al color blanco. Depende de cada sitio individual y de los colores del tema que utilice. Entonces, si el fondo es rojo y el borde de la imagen también es rojo, ocurre el mismo problema. Mi secuencia de comandos resuelve esto usando convertir herramienta. El -borde La opción agrega un borde a cada archivo de imagen con un tamaño de 1 píxel. Esta opción por sí sola sería suficiente, pero también quiero establecer el color usando -bordercolor opción. Aquí hay un ejemplo:

convert -bordercolor black -border 1 Screenshot-20210903202655.png

A continuación se muestra la misma imagen con un borde. ¿No se ve mejor?

Tu imagen está lista

Uso un for loop para iterar a través del directorio de capturas de pantalla. Llama a la función process_img para cada archivo. La función maneja tanto el ancho como el borde. El código completo realiza algunas comprobaciones de cordura, como garantizar que el archivo sea realmente una imagen.

process_img() {
     # verify that file is an image file, and then get dimensions
     if file "${SCREENSHOTS}"/"${1}" | grep -qE 'image|bitmap'; then
         [[ $VERBOSE -gt 0 ]] && echo "${1} is an image"
         W=$(identify -format %w "${SCREENSHOTS}"/"${1}")
     else
         echo "File ${SCREENSHOTS}/${1} is not an image."
         W=0
     fi
 
     # resize and border
     if [ "$W" -gt "$MAXWIDTH" ]
     then
         [[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
         convert -resize "${MAXWIDTH}" \
                 -bordercolor $BORDER \
                 -border 1 \
                 "${SCREENSHOTS}"/"${1}" \
                 "${READY}"/"${1}"
     else
         convert -bordercolor $BORDER \
                 -border 1 \
                 "${SCREENSHOTS}"/"${1}" \
                 "${READY}"/"${1}"
     fi
 }

El paso final del script es guardar los archivos procesados ​​en un subdirectorio llamado Ready , que está determinado por la variable denominada $READY . Esto conserva los archivos originales para su uso posterior.

Uso

Prepimg.sh incluye la función de ayuda esperada que describe sus argumentos y su uso:

$ prepimg.sh -h
prepimg.sh Version 0.7 - written by Alan Formy-Duval
prepimg.sh [OPTIONS]
--verbose, -v Be verbose
--directory, -d Screenshot directory (default: /home/alan/Pictures/Screenshots)
--ready, -r Ready directory (default: /home/alan/Pictures/Screenshots/Ready)
--border, -b Border color (default: black)

Código y conclusión

El código presentado en el artículo está incompleto y debe considerarse pseudocódigo. Puede ver el script completo en mi repositorio de Git.

La suite ImageMagick es un poderoso conjunto de herramientas para manipular imágenes. Puedes hacer muchas más cosas además de las funciones incorporadas en mi pequeño script. El corresponsal Jim Hall también escribió recientemente sobre su uso para cambiar el tamaño de una imagen.

Ya sea que prefiera secuencias de comandos Bash o codificación en otro lenguaje como C o Python, la automatización es de gran ayuda. Una y otra vez, he visto cómo un poco de código puede reducir tantos dolores de cabeza y permitirnos hacer un mejor uso de nuestro tiempo.


Linux
  1. nombre base con espacios en un script bash?

  2. Llame al script de Python desde bash con argumento

  3. Bash script que procesa un número limitado de comandos en paralelo

  4. Permiso denegado con bash.sh para ejecutar cron

  5. Ejecute el comando bash en la canalización de jenkins

Use este útil script de Bash cuando observe las estrellas

Cómo escribir un script Bash con ejemplos

Shell Scripting Parte I:Primeros pasos con bash scripting

Bash Beginner Series #10:Automatización con Bash

Tutorial de introducción a Bash Scripting con 5 ejemplos prácticos

Bash Script for Loop explicado con ejemplos