Консольное приложение на C++17 для конвертации изображений между форматами JPEG, PPM и BMP.
Проект реализован в виде приложения и отдельной библиотеки ImgLib, обеспечивающей единый интерфейс для работы с изображениями и возможность расширения новыми форматами.
-
конвертация изображений между форматами:
.jpg/.jpeg.ppm.bmp
-
автоматическое определение формата по расширению файла;
-
загрузка изображения в единое внутреннее представление;
-
сохранение изображения в целевом формате.
- отдельные модули чтения и записи для каждого формата;
- использование интерфейсов и полиморфизма;
- возможность добавления новых форматов без изменения основной логики приложения.
- обработка ошибок загрузки и сохранения;
- понятные коды завершения;
- проверка пользовательских аргументов.
- C++17
ImgLiblibjpeg
- CMake 3.11+
Проект разделён на приложение и библиотеку обработки изображений:
Input File
↓
ImageFormatInterface
↓
┌────────────────┐
│ JPEG Module │
├────────────────┤
│ PPM Module │
├────────────────┤
│ BMP Module │
└────────────────┘
↓
img_lib::Image
↓
Output File
Алгоритм работы:
- приложение получает входной и выходной файл;
- определяет формат по расширению;
- выбирает реализацию
ImageFormatInterface; - загружает изображение в
img_lib::Image; - сохраняет данные в целевом формате.
Добавление нового формата требует реализации нового обработчика и его подключения к механизму выбора формата.
ImgConverter/
│
├── ImgConverter/
│ └── main.cpp
│
└── ImgLib/
│
├── img_lib.*
│ ├── Image
│ └── Color
│
├── ppm_image.*
├── bmp_image.*
└── jpeg_image.*
- CMake >= 3.11
- Компилятор с поддержкой C++17
libjpeg
cmake -S . -B build \
-DLIBJPEG_DIR="C:/path/to/libjpeg"
cmake --build build --config Release./build/Release/imgconv input.jpg output.bmpФормат команды:
imgconv <input_file> <output_file>Примеры:
imgconv photo.jpg photo.ppm
imgconv frame.bmp frame.jpeg
imgconv image.ppm image.bmp| Код | Описание |
|---|---|
0 |
успешное завершение |
1 |
неверные аргументы запуска |
2 |
неизвестный формат входного файла |
3 |
неизвестный формат выходного файла |
4 |
ошибка загрузки |
5 |
ошибка сохранения |
- интерфейсы и полиморфизм;
- работа с бинарными форматами;
- проектирование модульной архитектуры;
- интеграция внешних библиотек;
- разделение приложения и библиотеки.