Работа с изображениями в C++: библиотека CImg и STB Image

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с изображениями в 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 — загрузка из буфера памяти (удобно для сетевых

Рекомендаций