Вопрос или проблема
Я ищу библиотеку C++ с заголовочными файлами, которая позволяет мне читать изображения в различных (распространенных) форматах. Мое использование концептуально не будет сложнее, чем этот сам поясняющий псевдокод:
// чтение изображения в любом формате
auto my_image( "oldimage.gif" );
// чтение и запись пикселей
my_image( row, column ).red = 55;
// сохранение изображения в любом формате
my_image.save( "newimage.tiff" );
До сих пор я использовал Magick++ для этих целей. Не только это излишне для моих очень ограниченных целей, но и его подключение в рамках большого проекта – это головная боль. Я надеюсь, что другая библиотека выполнит эту задачу с минимальными излишествами.
Вы могли бы попробовать CImg. Она использует шаблоны классов C++ для представления изображений, где T
означает то, в чем хранится каждый пиксель. Она состоит всего из одного заголовочного файла CImg.h
. Прекрасные особенности включают в себя то, как функции-модификаторы возвращают тот же класс, что позволяет их “связывать”, и поддержку внешних библиотек.
Форматы, которые она нативно поддерживает: ascii, cpp, dlm, bmp, jpeg, png, pnm, pnk, pfm, rgb minc2, nifti, cimg, inr, exr, pandore, raw, off (для 3d), yuv (сохранение нескольких изображений в видео) и tiff. Поддержка TIFF должна быть включена с помощью #define cimg_use_tiff
. Другие форматы изображений могут быть сохранены с этой библиотекой при установленном ImageMagick или GraphicsMagick.
Здесь вы найдете справочник для одноименного класса. Вы можете использовать fill
для большого количества пикселей или draw_point
для конкретного пикселя.
// чтение изображения в любом формате
CImg<unsigned char> my_image( "oldimage.gif"); //T=unsigned char, означает, что R/G/B должны быть целыми числами
// чтение и запись пикселя
my_image( column, row, 0 ) = 255;
my_image( column, row, 1 ) = 0;
my_image( column, row, 2 ) = 0;
// 0 для красного, 1 для зеленого, 2 для синего.
// просто запись пикселя
const unsigned char red[3] = { 255, 0, 0 };
my_image.draw_point( column, row, red );
// сохранение изображения в поддерживаемые форматы
my_image.save( "newimage.tiff" );
Ответ или решение
Для решения задачи, которую вы описали — чтение и запись изображений в разнообразных форматах с минимальными сложностями в интеграции и использовании — важно подобрать библиотеку, соответствующую вашему требованию к "header-only" реализации. Среди таких библиотек внимание заслуживает CImg. Она предлагает подход, основанный на использовании C++ шаблонов классов для представления изображений, при этом всё содержимое библиотеки заключено в одном файле заголовка — CImg.h
. Это упрощает подключение и использование библиотеки в проекте, избегая сложностей, связанных с зависимостями и проектной сборкой.
Теория
CImg представляет собой заголовочную библиотеку, разработанную специально для обработки изображений с поддержкой различных форматов. Ключевой особенностью CImg является её способность взаимодействовать с изображениями различных форматов (например, BMP, JPEG, PNG и другие), что делает её идеальным инструментом для задач, требующих минимизации сложностей как в программировании, так и в процессе сборки. Важно отметить, что CImg позволяет пользователей подключать сторонние библиотеки, такие как ImageMagick или GraphicsMagick, если им нужна поддержка дополнительных форматов.
Пример
Рассмотрим простой пример, который иллюстрирует использование CImg для чтения, изменения и сохранения изображений:
#include "CImg.h"
using namespace cimg_library;
int main() {
// Загрузка изображения любого поддерживаемого формата
CImg<unsigned char> my_image("oldimage.gif");
// Чтение и изменение конкретного пикселя (в формате RGB)
my_image(column, row, 0) = 255; // Красный
my_image(column, row, 1) = 0; // Зелёный
my_image(column, row, 2) = 0; // Синий
// Альтернативный способ изменения пикселя
const unsigned char red[3] = { 255, 0, 0 };
my_image.draw_point(column, row, red);
// Сохранение изображения в поддерживаемом формате
my_image.save("newimage.tiff");
return 0;
}
Применение
Вышеописанные возможности и легкость интеграции делают CImg идеальным выбором для разработчиков, работающих с большими проектами, где минимизация зависимости критична. Возможность поддерживать дополнительные форматы изображений при помощи сторонних библиотек делает CImg универсальным инструментом. Такие функции, как модификация определённых пикселей, реализованные при помощи функций fill
и draw_point
, позволяют гибко и точно управлять содержанием изображения.
В контексте вашего запроса на замену Magick++ — CImg позиционируется как более лёгкое и удобное решение для задач, не требующих внешних зависимостей и сложных механизмов сборки. Вы сможете интегрировать эту библиотеку в ваш проект, минимизировав усилия на конфигурацию, что важно в больших и сложных разработках.
Подытоживая, CImg предлагает полный набор функций для работы с изображениями в единственном заголовочном файле и это делает её прекрасным выбором для всех, кто ценит простоту, лёгкость и функциональную насыщенность. Она удовлетворяет требования к универсальности, поддержке множества форматов и минимальным трудозатратам на интеграцию, что важно в современном разработке ПО.