Работа с изображениями в C++: обзор библиотек и практические примеры
Обработка цифровых изображений — одна из ключевых задач современного программирования. В C++ существует несколько мощных библиотек, позволяющих загружать, изменять, анализировать и сохранять изображения. В этой статье мы рассмотрим три наиболее популярных инструмента: CImg (лёгкая и простая), OpenCV (промышленный стандарт для компьютерного зрения) и GraphicsMagick (для высокопроизводительной конвертации).
1. CImg — лёгкая библиотека для базовых операций
CImg (The C++ Template Image Processing Library) — это заголовочная библиотека, не требующая установки дополнительных DLL. Она идеально подходит для учебных проектов и быстрого прототипирования. Поддерживает форматы BMP, PNG, JPEG, TIFF (через внешние кодеки).
Установка
Достаточно скачать файл CImg.h и подключить его в проект. Для работы с JPEG/PNG потребуются также libjpeg, libpng и zlib.
Пример: загрузка, инверсия цветов и сохранение
#include "CImg.h"
using namespace cimg_library;
int main() {
// Загружаем изображение
CImg<unsigned char> img("input.jpg");
// Инвертируем цвета (пиксель = 255 - пиксель)
CImg<unsigned char> inverted = 255 - img;
// Применяем размытие по Гауссу (радиус 3)
CImg<unsigned char> blurred = img.get_blur(3);
// Сохраняем результаты
inverted.save("inverted.jpg");
blurred.save("blurred.jpg");
return 0;
}
2. OpenCV — мощный фреймворк для компьютерного зрения
OpenCV (Open Source Computer Vision Library) — де-факто стандарт для задач распознавания, детекции объектов и сложной обработки изображений. Поддерживает сотни алгоритмов, работу с видео, нейронными сетями. Является кроссплатформенным.
Установка
На Ubuntu: sudo apt install libopencv-dev. На Windows — через vcpkg или официальный установщик.
Пример: обнаружение границ (Canny) и изменение размера
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// Чтение изображения
Mat img = imread("photo.jpg");
if (img.empty()) return -1;
// Преобразование в оттенки серого
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
// Обнаружение границ алгоритмом Canny
Mat edges;
Canny(gray, edges, 50, 150);
// Изменение размера до 300x300
Mat resized;
resize(img, resized, Size(300, 300));
// Сохранение и показ
imwrite("edges.jpg", edges);
imshow("Original", img);
waitKey(0);
return 0;
}
3. GraphicsMagick — быстрая конвертация и пакетная обработка
GraphicsMagick — форк ImageMagick, ориентированный на стабильность и производительность. Используется для массовой конвертации, изменения размера, водяных знаков. Работает с более чем 200 форматами.
Установка
Через пакетный менеджер: sudo apt install graphicsmagick. Для C++ требуется библиотека libgraphicsmagick++-dev.
Пример: уменьшение изображения и конвертация в PNG
#include <Magick++.h>
using namespace Magick;
int main() {
InitializeMagick(nullptr);
// Загрузка изображения
Image image("input.tiff");
// Масштабирование до 800 пикселей по ширине
image.scale(Geometry("800x"));
// Поворот на 90 градусов
image.rotate(90);
// Установка качества JPEG (если выходной формат JPEG)
image.quality(85);
// Сохранение в PNG
image.write("output.png");
return 0;
}
Сравнение библиотек
- CImg — простой старт, минимум зависимостей, подходит для обучения и простых фильтров.
- OpenCV — максимальная функциональность (фильтры, детекторы, ML), сложнее в сборке, но незаменим для серьёзных проектов.
- GraphicsMagick — лучший выбор для конвертации форматов и пакетной обработки, высокая скорость.
Рекомендации по выбору
Также в библиотеке
Реактивное программирование в C# (.NET): Rx.NET и IObservable
Отправка SMS на Java: обзор API библиотек и инструментов
WebSocket библиотека Kotlin: ktor-client-websockets для реального времени
GraphQL в Swift: Полное руководство по библиотеке Apollo iOS
Геолокация и карты в Kotlin: Полное руководство по интеграции
Рекомендаций
Также в библиотеке
Отправка SMS на Java: обзор API библиотек и инструментов
WebSocket библиотека Kotlin: ktor-client-websockets для реального времени
GraphQL в Swift: Полное руководство по библиотеке Apollo iOS
Геолокация и карты в Kotlin: Полное руководство по интеграции