Работа с изображениями в C++: библиотеки CImg и STB Image
Обработка изображений — одна из ключевых задач в компьютерной графике, компьютерном зрении и веб-технологиях. В C++ нет встроенных средств для работы с растровыми изображениями, но существует множество сторонних библиотек. В этой статье мы рассмотрим две популярные и лёгкие в использовании библиотеки: CImg (для высокоуровневой обработки) и STB Image (для быстрой загрузки/сохранения популярных форматов).
1. CImg: универсальная библиотека для обработки изображений
CImg (C++ Template Image Processing Library) — это заголовочная библиотека (header-only), которая предоставляет широкий набор функций для загрузки, отображения, фильтрации и анализа изображений. Она поддерживает форматы BMP, JPEG, PNG, TIFF и другие (при наличии дополнительных библиотек, таких как libpng, libjpeg).
Установка и подключение
Скачайте последнюю версию с официального сайта. Затем просто подключите заголовочный файл:
#include "CImg.h"
using namespace cimg_library;
Основные операции с CImg
Рассмотрим загрузку, изменение размера и применение фильтра Гаусса:
#include "CImg.h"
#include <iostream>
int main() {
// Загрузка изображения (поддерживаются BMP, JPG, PNG и др.)
CImg<unsigned char> img("input.jpg");
// Изменение размера до 400x300
CImg<unsigned char> resized = img.resize(400, 300);
// Применение размытия по Гауссу (радиус 3)
CImg<unsigned char> blurred = resized.get_blur(3.0f);
// Сохранение результата
blurred.save("output.jpg");
std::cout << "Изображение обработано!" << std::endl;
return 0;
}
Дополнительные возможности CImg
- Фильтры: размытие, повышение резкости, медианный фильтр, морфологические операции.
- Цветовые преобразования: перевод в оттенки серого, HSV, Lab.
- Гистограмма: построение и выравнивание.
- Рисование: линии, окружности, текст на изображении.
- Отображение: встроенное окно для просмотра (требует X11 на Linux или WinAPI на Windows).
2. STB Image: быстрая загрузка и сохранение
STB Image — это набор однозаголовочных библиотек от Sean Barrett, предназначенных для чтения/записи изображений в форматах PNG, JPG, BMP, GIF и других. Основное преимущество — минимализм и скорость. Не требует установки, просто включите файл stb_image.h и stb_image_write.h.
Подключение
Скачайте файлы с GitHub. Для использования определите макрос STB_IMAGE_IMPLEMENTATION ровно в одном .cpp файле:
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
Пример: загрузка PNG и сохранение в 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;
// Загрузка изображения (возвращает массив пикселей в формате RGB/RGBA)
unsigned char* img = stbi_load("input.png", &width, &height, &channels, 3);
if (!img) {
std::cerr << "Ошибка загрузки изображения!" << std::endl;
return -1;
}
// Сохранение как JPEG с качеством 90
stbi_write_jpg("output.jpg", width, height, 3, img, 90);
// Освобождение памяти
stbi_image_free(img);
std::cout << "Конвертация завершена!" << std::endl;
return 0;
}
Основные функции STB Image
- stbi_load — загрузка изображения из файла (поддерживает PNG, JPG, BMP, GIF, TGA, PSD).
- stbi_load_from_memory — загрузка из буфера памяти (удобно для сетевых
Также в библиотеке
Prisma для JavaScript (Node.js): полное руководство с примерами
GraphQL библиотека TypeScript: полное руководство по инструментам
Планировщик задач на C# (.NET): Quartz.NET и System.Threading.Timer
Работа с изображениями в Go: resize и crop с библиотекой imaging