Консольный редактор изображений формата BMP, написанный на чистом C++ (стандарт C++14) без использования сторонних библиотек. Проект позволяет выполнять различные манипуляции с изображениями через аргументы командной строки.
Для сборки проекта требуются g++ и make.
# Сборка проекта
make
# Очистка скомпилированных файлов
make cleanПосле успешной сборки в корневой директории появится исполняемый файл main.
Общий синтаксис запуска программы:
./main -i <входной_файл.bmp> [инструмент] [параметры_инструмента] -o <выходной_файл.bmp>Если флаг -o не указан, изменённое изображение будет по умолчанию сохранено в файл ./out.bmp.
-i,--input— путь к исходному файлу.-o,--output— путь для сохранения результата.-h,--help— вывод справки по всем доступным командам.--info— вывод технической информации об исходном изображении (размеры, глубина цвета и т.д.).
- Координаты задаются в формате
X.Y(например,10.50). - Цвета задаются в формате
R.G.B, где каждая компонента принимает значения от 0 до 255 (например,--color 255.0.0задает красный цвет).
Рисует прямоугольник по заданным координатам.
--left_up X.Y— координаты левого верхнего угла.--right_down X.Y— координаты правого нижнего угла.--thickness N— толщина линий (число больше 0).--color R.G.B— цвет линий.--fill— флаг для заливки прямоугольника.--fill_color R.G.B— цвет заливки (если указан флаг--fill).
Пример:
./main -i input.bmp --rect --left_up 10.10 --right_down 100.100 --thickness 3 --color 255.0.0 --fill --fill_color 0.255.0 -o output.bmpРисует окружность с заданным центром и радиусом.
--center X.Y— координаты центра окружности.--radius N— радиус окружности.--thickness N— толщина линий.--color R.G.B— цвет линии.--fill— флаг для заливки.--fill_color R.G.B— цвет заливки (если указан флаг--fill).
Пример:
./main -i input.bmp --circle --center 50.50 --radius 30 --thickness 2 --color 0.0.255 -o output.bmpПоворачивает выделенную прямоугольную область изображения.
--left_up X.Y— координаты левого верхнего угла области.--right_down X.Y— координаты правого нижнего угла области.--angle N— угол поворота по часовой стрелке. Допустимые значения:90,180,270.
Пример:
./main -i input.bmp --rotate --left_up 0.0 --right_down 200.200 --angle 90 -o output.bmpДобавляет декоративную рамку-узор по краям изображения.
--pattern TYPE— тип узора. Обязательные значения:rectangle,circle,semicircles.--color R.G.B— основной цвет узора.--thickness N— ширина элементов узора (число больше 0).--count N— количество элементов или плотность узора.
Пример:
./main -i input.bmp --ornament --pattern circle --color 128.0.128 --thickness 10 --count 5 -o output.bmpВ целях соблюдения требования «без сторонних библиотек» все графические примитивы реализованы математически с нуля:
- Отрисовка линий: Используется алгоритм Брезенхэма (Bresenham's line algorithm), который позволяет строить прямые линии только за счет целочисленных вычислений. Это используется, в том числе, для создания прямоугольников и узоров с заданной толщиной (когда линия рисуется круговой кистью, двигающейся по алгоритму).
- Отрисовка окружностей (контур): Применяется алгоритм Брезенхэма для окружностей (Midpoint circle algorithm). Он эффективно вычисляет координаты точек дуги без использования тригонометрических функций.
- Заливка окружностей: Используется математическое уравнение круга
(x - x0)^2 + (y - y0)^2 <= R^2в пределах ограничивающего прямоугольника (bounding box). - Поворот области (Rotation): Реализован на основе матричных преобразований поворота на углы кратные 90 градусам (координатный маппинг пикселей). Выполняется через буфер (копию цветов), чтобы избежать наложения при перезаписи пикселей.
Весь код разбит на логические модули в директории libs/:
args_parsing_lib/— парсинг аргументов командной строки (getopt) и их валидация с помощью регулярных выражений.bmp_image_lib/— низкоуровневая логика работы со структурой файла BMP (чтение заголовков, пикселей, запись).image_editor_lib/— реализация алгоритмов и инструментов редактирования (рисование кругов, прямоугольников, поворот).data_processing_lib/— фасад и связующее звено, обрабатывающее распарсенные параметры и вызывающее методы редактора.