Trabalho com imagens em C++: bibliotecas CImg e STB Image
O processamento de imagens é uma das tarefas principais na computação gráfica, visão computacional e tecnologias web. Em C++ não existem ferramentas nativas para trabalhar com imagens raster, mas existem muitas bibliotecas de terceiros. Neste artigo, veremos duas bibliotecas populares e fáceis de usar: CImg (para processamento de alto nível) e STB Image (para carregamento/salvamento rápido de formatos populares).
1. CImg: biblioteca universal para processamento de imagens
CImg (C++ Template Image Processing Library) é uma biblioteca header-only que oferece um amplo conjunto de funções para carregar, exibir, filtrar e analisar imagens. Ela suporta os formatos BMP, JPEG, PNG, TIFF e outros (com bibliotecas adicionais, como libpng, libjpeg).
Instalação e inclusão
Baixe a versão mais recente do site oficial. Em seguida, basta incluir o arquivo de cabeçalho:
#include "CImg.h"using namespace cimg_library;Operações básicas com CImg
Vamos ver o carregamento, redimensionamento e aplicação do filtro Gaussiano:
#include "CImg.h"#include <iostream>
int main() { // Carregamento da imagem (suporta BMP, JPG, PNG e outros) CImg<unsigned char> img("input.jpg"); // Redimensionamento para 400x300 CImg<unsigned char> resized = img.resize(400, 300); // Aplicação de desfoque Gaussiano (raio 3) CImg<unsigned char> blurred = resized.get_blur(3.0f); // Salvamento do resultado blurred.save("output.jpg"); std::cout << "Imagem processada!" << std::endl; return 0;}Recursos adicionais do CImg
- Filtros: desfoque, nitidez, filtro mediano, operações morfológicas.
- Transformações de cor: conversão para tons de cinza, HSV, Lab.
- Histograma: construção e equalização.
- Desenho: linhas, círculos, texto na imagem.
- Exibição: janela integrada para visualização (requer X11 no Linux ou WinAPI no Windows).
2. STB Image: carregamento e salvamento rápidos
STB Image é um conjunto de bibliotecas de cabeçalho único de Sean Barrett, projetadas para leitura/escrita de imagens nos formatos PNG, JPG, BMP, GIF e outros. A principal vantagem é o minimalismo e a velocidade. Não requer instalação, basta incluir os arquivos stb_image.h e stb_image_write.h.
Inclusão
Baixe os arquivos do GitHub. Para usar, defina a macro STB_IMAGE_IMPLEMENTATION em exatamente um arquivo .cpp:
#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION#include "stb_image_write.h"Exemplo: carregar PNG e salvar em JPG
#include <iostream>
#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"#define STB_IMAGE_WRITE_IMPLEMENTATION#include "stb_image_write.h"
int main() { int width, height, channels; // Carregamento da imagem (retorna array de pixels no formato RGB/RGBA) unsigned char* img = stbi_load("input.png", &width, &height, &channels, 3); if (!img) { std::cerr << "Erro ao carregar a imagem!" << std::endl; return -1; } // Salvamento como JPEG com qualidade 90 stbi_write_jpg("output.jpg", width, height, 3, img, 90); // Liberação de memória stbi_image_free(img); std::cout << "Conversão concluída!" << std::endl; return 0;