Skip to content

About

Консольный редактор изображений формата BMP, написанный на чистом C++

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

BMP Image Editor (CLI)

Консольный редактор изображений формата 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 задает красный цвет).

🛠 Доступные инструменты

1. Рисование прямоугольника (--rect)

Рисует прямоугольник по заданным координатам.

  • --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

2. Рисование окружности (--circle)

Рисует окружность с заданным центром и радиусом.

  • --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

3. Поворот области (--rotate)

Поворачивает выделенную прямоугольную область изображения.

  • --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

4. Рамка в виде узора (--ornament)

Добавляет декоративную рамку-узор по краям изображения.

  • --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

🧠 Используемые алгоритмы

В целях соблюдения требования «без сторонних библиотек» все графические примитивы реализованы математически с нуля:

  1. Отрисовка линий: Используется алгоритм Брезенхэма (Bresenham's line algorithm), который позволяет строить прямые линии только за счет целочисленных вычислений. Это используется, в том числе, для создания прямоугольников и узоров с заданной толщиной (когда линия рисуется круговой кистью, двигающейся по алгоритму).
  2. Отрисовка окружностей (контур): Применяется алгоритм Брезенхэма для окружностей (Midpoint circle algorithm). Он эффективно вычисляет координаты точек дуги без использования тригонометрических функций.
  3. Заливка окружностей: Используется математическое уравнение круга (x - x0)^2 + (y - y0)^2 <= R^2 в пределах ограничивающего прямоугольника (bounding box).
  4. Поворот области (Rotation): Реализован на основе матричных преобразований поворота на углы кратные 90 градусам (координатный маппинг пикселей). Выполняется через буфер (копию цветов), чтобы избежать наложения при перезаписи пикселей.

🏗 Структура проекта

Весь код разбит на логические модули в директории libs/:

  • args_parsing_lib/ — парсинг аргументов командной строки (getopt) и их валидация с помощью регулярных выражений.
  • bmp_image_lib/ — низкоуровневая логика работы со структурой файла BMP (чтение заголовков, пикселей, запись).
  • image_editor_lib/ — реализация алгоритмов и инструментов редактирования (рисование кругов, прямоугольников, поворот).
  • data_processing_lib/ — фасад и связующее звено, обрабатывающее распарсенные параметры и вызывающее методы редактора.

About

Консольный редактор изображений формата BMP, написанный на чистом C++

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages