
Manipulación de imágenes con ImageMagick a través de VBA
Para aquellos de ustedes que han seguido este blog a lo largo de los años, saben que he explorado varias herramientas de manipulación de imágenes, cosas como:
- Ensayo de la IA
- GDI+
- Imagen libre
- Vista de Irfran
Bueno, decidí explorar otra opción, ImageMagick.


Pros y contras
¡Qué he notado después de usar ImageMagick, sin ningún orden en particular!
Ventajas
- ¡Una de las cosas que me encanta es que puedes descargar y usar la versión portátil sin necesidad de instalar nada!
- La calidad resultante de las imágenes generadas por ImageMagick es muy buena.
- Basado en línea de comandos. Por este motivo, se puede integrar fácilmente en una variedad de lenguajes de programación, incluido VBA.
- Puede encadenar los comandos para realizar múltiples operaciones en una sola llamada.
- Admite una ENORME variedad de formatos de imagen, incluido webp, por ejemplo.
Contras
- He descubierto que ImageMagick es «más lento» en comparación con otras opciones. Dicho esto, la diferencia sigue siendo insignificante y de ninguna manera me disuadiría de usar ImageMagick, ¡especialmente considerando todas sus capacidades!
Ejemplos de comandos
A continuación se muestran algunos ejemplos de cómo se puede utilizar ImageMagick, pero tenga en cuenta que puede hacer mucho, mucho, ¡MUCHO más! Esto es realmente solo la punta del iceberg para ilustrar algunas de las tareas de manipulación de imágenes más comunes.
Para ejecutar cualquiera de estos, abra un símbolo del sistema y navegue a su carpeta ImageMagick y luego ejecute el comando especificado.
En los ejemplos a continuación, estoy usando “C:\…\…\YourImageFile.jpg” como el archivo de imagen con el que trabajar, así que actualícelo con la ruta/nombre de archivo de su archivo.
Tenga en cuenta que ImageMagick sobrescribirá los archivos existentes sin previo aviso, así que asegúrese de trabajar con imágenes de prueba hasta que haya perfeccionado su código/comandos.
Determinar qué formatos de imagen son compatibles
magick identify -list format
Obtener información sobre una imagen
Para obtener información básica:
magick identify "C:\...\...\YourImageFile.jpg"
Para más información:
magick identify -verbose "C:\...\...\YourImageFile.jpg"
Recuperar la información Exif de la imagen
A continuación se muestran algunos ejemplos de cómo trabajar con información Exif de imágenes.
Recuperar TODA la información Exif de la imagen
magick identify -format "%(EXIF:*)" "C:\...\...\YourImageFile.jpg"
Recuperar un valor de propiedad Exif de una imagen específica
Para recuperar el valor de la propiedad exif ‘Orientación’ de la imagen…
magick identify -format "%(EXIF:orientation)" "C:\...\...\YourImageFile.jpg"
Exportar información Exif a un archivo de texto
magick "C:\...\...\YourImageFile.jpg" -format "%(EXIF:*)" info: > "C:\...\...\YourOutputFile.txt"
Convertir formatos de imagen
Para convertir un jpg en un png… y la ruta de salida puede ser cualquier lugar y no necesita estar en la misma carpeta que la imagen original.
magick "C:\...\...\YourImageFile.jpg" "C:\...\...\YourOutputImageFile.png"
Girar una imagen
Rotar una imagen 90°
magick "C:\...\...\YourImageFile.jpg" -rotate 90 "C:\...\...\YourOutputImageFile.jpg"
Cambiar el tamaño de una imagen
magick "C:\...\...\YourImageFile.jpg" -resize 150x375 "C:\...\...\YourOutputImageFile.jpg"
donde 150 es el ancho deseado y 375 es la altura deseada de la imagen de salida.
Cambiar el formato de color/espacio de color
En blanco y negro
magick "C:\...\...\YourImageFile.jpg" -monochrome "C:\...\...\YourOutputImageFile.jpg"
Escala gris
magick "C:\...\...\YourImageFile.jpg" -colorspace gray "C:\...\...\YourOutputImageFile.jpg"
o
magick "C:\...\...\YourImageFile.jpg" -separate "C:\...\...\YourOutputImageFile.jpg"
o
magick "C:\...\...\YourImageFile.jpg" -threshold 20% "C:\...\...\YourOutputImageFile.jpg"
Sepia
magick "C:\...\...\YourImageFile.jpg" -sepia-tone 70% "C:\...\...\YourOutputImageFile.jpg"
Voltear una imagen
Girar a lo largo del eje horizontal (en dirección vertical)
magick "C:\...\...\YourImageFile.jpg" -flip "C:\...\...\YourOutputImageFile.jpg"
Girar a lo largo del eje vertical (en dirección horizontal)
magick "C:\...\...\YourImageFile.jpg" -flop "C:\...\...\YourOutputImageFile.jpg"
Obtener la representación Base64 de una imagen
magick "C:\...\...\YourImageFile.jpg" INLINE:JPG:-
magick "C:\...\...\YourImageFile.jpg" INLINE:PNG:-
Crear un TIFF de varias páginas
Básico
magick "C:\...\...\YourImageFile1.jpg" "C:\...\...\YourImageFile2.png" "C:\...\...\YourImageFile3.gif" "C:\...\...\YourImageFile4.jpg" "C:\...\...\YourOutputImageFile.tif"
Con compresión
Créame, es mejor utilizar compresión, de lo contrario el archivo se saldrá de control rápidamente.
magick "C:\...\...\YourImageFile1.jpg" "C:\...\...\YourImageFile2.png" "C:\...\...\YourImageFile3.gif" "C:\...\...\YourImageFile4.jpg" -compress zip "C:\...\...\YourOutputImageFile.tif"
magick "C:\...\...\YourImageFile1.jpg" "C:\...\...\YourImageFile2.png" "C:\...\...\YourImageFile3.gif" "C:\...\...\YourImageFile4.jpg" -compress lzw "C:\...\...\YourOutputImageFile.tif"
Recuperar el recuento de páginas de un TIFF de varias páginas
magick identify -format ""%n\n"" "C:\...\...\YourImageFile.jpg"
Encadenamiento de comandos
Una de las cosas más interesantes de ImageMagick es la cantidad de comandos disponibles. Lo que he proporcionado anteriormente es apenas una pequeña parte de lo que realmente está disponible para modificar imágenes.
La mejor parte de ImageMagick es que nos permite ejecutar múltiples comandos en una sola llamada.
Ejemplo básico
Entonces, digamos que queremos rotar (90o) y convertir una imagen (jpg->png), uno podría pensar que necesitamos realizar 2 llamadas distintas, algo así como
magick "C:\...\...\YourImageFile.jpg" -rotate 90 "C:\...\...\YourOutputImageFile.jpg"
magick "C:\...\...\YourOutputImageFile.jpg" "C:\...\...\YourFinalOutputImageFile.png"
Entonces, la primera llamada es para rotar la imagen, luego la segunda llamada es para tomar esa imagen resultante y convertirla a otro formato.
No, eso no es necesario ni tampoco es una forma inteligente de operar cuando se utiliza ImageMagick. En cambio, podemos simplemente encadenar los comandos en una sola llamada, como
magick "C:\...\...\YourImageFile.jpg" -rotate 90 "C:\...\...\YourOutputImageFile.png"
Ejemplo avanzado
Puede agregar tantos comandos como necesite, por ejemplo
magick "C:\...\...\YourImageFile.jpg" -resize 150x200 -colorspace gray -rotate 90 "C:\...\...\YourOutputImageFile.png"
Así, en una sola llamada podrás hacerlo todo:
- cambiar el tamaño
- girar
- convertir
- cambiar el espacio de color
y podrías agregar aún más comandos si eso es lo que necesitas.
VBA
Bien, ahora que comprendemos la sintaxis básica de la línea de comandos para usar ImageMagick, incorporarlo a cualquier entorno VBA no es más complicado que usar la función Shell. Eso es todo.
Por ejemplo, un ejemplo rápido podría ser:
Dim sIMPath As String Dim sCmd As String sIMPath = Application.CurrentProject.Path & "\ImageMagick\" sCmd = sIMPath & "magick identify -list format" Shell "cmd /K" & sCmd, vbNormalFocus
u otro ejemplo para recuperar las propiedades EXIF de una imagen
Dim sIMPath As String Dim sCmd As String Const sFile = "C:\...\...\YourImageFile.jpg" sIMPath = Application.CurrentProject.Path & "\ImageMagick\" sCmd = sIMPath & "magick identify -format '%(EXIF:*)' """ & sFile & """" Shell "cmd /K " & sCmd, vbNormalFocus
Estos ejemplos emplean el comando cmd /K que abre las ventanas de comandos visibles para el usuario… Obviamente, en una solución real queremos realizar acciones, obtener valores con la ventana de comandos abierta o requiriendo la interacción del usuario. En este caso, podemos emplear uno de los enfoques para ejecutar comandos del símbolo del sistema y devolver la respuesta de mi artículo:


sigue leyendo
y luego cambia /K a /C.
Revise la base de datos de demostración para obtener más ejemplos de esta implementación y otros trucos.
Aliviando la carga
Solo una nota al margen rápida: unas pruebas rápidas me revelaron que, según tus necesidades y los comandos que uses, incluso es posible eliminar varios archivos de la carpeta ImageMagick para aligerar el espacio ocupado. No creo que esto sea realmente un problema, pero pensé que lo mencionaría para aquellos que siempre intentan minimizar el espacio que ocupan sus soluciones.
Base de datos de demostración
Siéntase libre de descargar una copia 100% desbloqueada de una base de datos de muestra que he reunido utilizando el enlace que se proporciona a continuación:
Descargar la “Base de datos de demostración de Microsoft Access ImageMagick”
ImageMagick.zip – Descargado 123 veces – 130,43 KB
Instrucciones especiales:
Después de extraer el archivo zip, crea una carpeta dentro de la carpeta ImageMagick llamada ImageMagick y extrae todos los archivos de la versión portátil de ImageMagick que has descargado del sitio oficial.
Aviso sobre contenido/descargas/demostraciones
Descargo de responsabilidad/Notas:
Si no tiene Microsoft Access, simplemente descargue e instale la versión de ejecución disponible gratuitamente (esto permite ejecutar bases de datos de MS Access, pero no modificar su diseño):
Tiempo de ejecución de Microsoft Access 2010
Tiempo de ejecución de Microsoft Access 2013
Tiempo de ejecución de Microsoft Access 2016
Tiempo de ejecución de Microsoft 365 Access
En ningún caso Devhut.net o CARDA Consultants Inc. serán responsables ante el cliente/usuario final o cualquier tercero por cualquier daño, incluyendo cualquier pérdida de ganancias, pérdida de ahorros u otros daños incidentales, consecuentes o especiales que surjan del funcionamiento o la imposibilidad de operar el software que CARDA Consultants Inc. ha proporcionado, incluso si CARDA Consultants Inc. ha sido advertido de la posibilidad de tales daños.
Llevando las cosas aún más lejos
Lo anterior se armó con fines demostrativos y se puede ampliar fácilmente aún más considerando todas las posibilidades que ImageMagick tiene para ofrecer, el código necesita ser reforzado aún más (a prueba de errores, implementadas validaciones, …), pero espero que ayude a algunos de ustedes a poner en marcha dicho código rápidamente.
He creado un formulario para seleccionar una carpeta y procesar por lotes todas las imágenes que contiene. ¡Esto es genial para el desarrollo web y para optimizar imágenes para usar en bases de datos!
También he utilizado ImageMagick para recomprimir archivos PDF y reducir considerablemente su tamaño.
¡Espero que esto te dé ganas de probar esta fabulosa herramienta de imágenes, ya que es realmente una hermosa solución que se nos brinda a todos!