Trabajo con imágenes en C++: resumen de bibliotecas y ejemplos prácticos
El procesamiento de imágenes digitales es una de las tareas clave de la programación moderna. En C++ existen varias bibliotecas potentes que permiten cargar, modificar, analizar y guardar imágenes. En este artículo revisaremos tres de las herramientas más populares: CImg (ligera y sencilla), OpenCV (estándar industrial para visión por computadora) y GraphicsMagick (para conversión de alto rendimiento).
1. CImg — biblioteca ligera para operaciones básicas
CImg (The C++ Template Image Processing Library) es una biblioteca de solo cabecera que no requiere la instalación de DLL adicionales. Es ideal para proyectos educativos y prototipado rápido. Soporta los formatos BMP, PNG, JPEG, TIFF (a través de códecs externos).
Instalación
Basta con descargar el archivo CImg.h e incluirlo en el proyecto. Para trabajar con JPEG/PNG también se necesitarán libjpeg, libpng y zlib.
Ejemplo: carga, inversión de colores y guardado
#include "CImg.h"using namespace cimg_library;
int main() { // Cargamos la imagen CImg<unsigned char> img("input.jpg"); // Invertimos los colores (píxel = 255 - píxel) CImg<unsigned char> inverted = 255 - img; // Aplicamos desenfoque gaussiano (radio 3) CImg<unsigned char> blurred = img.get_blur(3); // Guardamos los resultados inverted.save("inverted.jpg"); blurred.save("blurred.jpg"); return 0;}2. OpenCV — potente framework para visión por computadora
OpenCV (Open Source Computer Vision Library) es el estándar de facto para tareas de reconocimiento, detección de objetos y procesamiento complejo de imágenes. Soporta cientos de algoritmos, trabajo con video y redes neuronales. Es multiplataforma.
Instalación
En Ubuntu: sudo apt install libopencv-dev. En Windows — a través de vcpkg o el instalador oficial.
Ejemplo: detección de bordes (Canny) y cambio de tamaño
#include <opencv2/opencv.hpp>using namespace cv;
int main() { // Lectura de la imagen Mat img = imread("photo.jpg"); if (img.empty()) return -1; // Conversión a escala de grises Mat gray; cvtColor(img, gray, COLOR_BGR2GRAY); // Detección de bordes con el algoritmo Canny Mat edges; Canny(gray, edges, 50, 150); // Cambio de tamaño a 300x300 Mat resized; resize(img, resized, Size(300, 300)); // Guardado y visualización imwrite("edges.jpg", edges); imshow("Original", img); waitKey(0); return 0;}3. GraphicsMagick — conversión rápida y procesamiento por lotes
GraphicsMagick es un fork de ImageMagick, orientado a la estabilidad y el rendimiento. Se utiliza para conversión masiva, cambio de tamaño, marcas de agua. Trabaja con más de 200 formatos.
Instalación
A través del gestor de paquetes: sudo apt install graphicsmagick. Para C++ se requiere la biblioteca libgraphicsmagick++-dev.
Ejemplo: reducción de imagen y conversión a PNG
#include <Magick++.h>using namespace Magick;
int main() { InitializeMagick(nullptr); // Carga de la imagen Image image("input.tiff"); // Escalado a 800 píxeles de ancho image.scale(Geometry("800x")); // Rotación de 90 grados image.rotate(90); // Configuración de la calidad JPEG (si el formato de salida es JPEG) image.quality(85); // Guardado en PNG image.write("output.png"); return 0;}Comparación de bibliotecas
- CImg — inicio simple, mínimo
También en la biblioteca
Event Bus y el patrón Observer en Java: implementación de una arquitectura débilmente acoplada
Contenedor de Inyección de Dependencias Swift: Swinject para iOS/macOS
Generación de informes PDF en PHP: revisión de bibliotecas y ejemplos
Colly para Go: guía completa con ejemplos prácticos