Разработать две консольные утилиты: для конвертации BMP изображений в негатив и для попиксельного сравнения двух BMP изображений.
- Написать библиотеку
bmp, которая будет состоять из необходимых для реализации утилит функций по работе с BMP изображениями (например, чтение, запись и тд), и на основе этой библиотеки сделать две утилиты:converterиcomparer.- Должны поддерживаться два формата BMP: 8bit и 24bit.
- Должен поддерживаться только
BITMAPINFOHEADERс размером header’а 40 байтов, сжатие поддерживать не надо.
- Валидировать пользовательский ввод на предмет отсутствующих, лишних, или неверных аргументов. В случае ошибки вывести внятное и осмысленное сообщение в стандартный поток ошибок.
- Отладить программу с помощью Address Sanitizer и/или Valgrind/Memcheck, решить проблемы работы с указателями и памятью.
Important
Перед тестированием решение будет проверено форматтером clang-format (можно положить конфигурационный файл в репозиторий с решением, тогда будет использован, иначе будет использованы стандартные настройки) и линтером clang-tidy (конфигурационный файл, который будет использован можно посмотреть в репозитории тестирующей системы).
Будет использоваться стандартная для runner'а версия инструментов (сейчас это 18.1.3).
Также тестирование будет производиться с использованием ASan и UBSan.
Note
Некоторые поля в заголовках BMP могут конфликтовать с реальным устройством файла (в таком случае считаем изображение некорректным). На такие ситуации есть закрытые тесты.
Утилита считывает изображение из файла, конвертирует его в негатив и записывает в другой файл. Преобразование 8bit изображений осуществляется путем инвертирования таблицы цветов, 24bit изображений – путем попиксельного инвертирования. Пути до входного и выходного файла передаются через аргументы командной строки.
converter input.bmp output.bmp0— изображение успешно сконвертировано.1— некорректные аргументы командной строки, неподдерживаемый формат, ошибки, которые относятся к структуре изображения и иные ошибки. Также необходимо вывести внятное сообщение о случившейся ошибке в стандартный поток ошибок.- Других кодов возврата быть не должно.
Утилита считывает два изображения из файлов и производит попиксельное сравнение. Пути до файлов передаются через аргументы командной строки.
- Если изображения попиксельно совпадают (Код возврата:
0), вывести сообщениеImages are sameв стандартный поток вывода. - Если изображения различны (Код возврата:
2), вывести в стандартный поток ошибок координаты первых 100 различающихся пикселей в следующем формате:- Вывести сообщение
"Next pixels are different:\n" - Выводить пиксели в формате:
"x%-6d y%-6d\n" - Считаем за начало координат левый нижний угол (координаты не могут быть отрицательными и растут лишь в плюс).
- Если картинка
mпикселей в ширину иnв высоту, то выводим:
- Вывести сообщение
X₀ Y₀
X₁ Y₀
…
Xₘ₋₁ Y₀
X₀ Y₁
X₁ Y₁
…
- Если сравнение невозможно в принципе (Код возврата:
1), например, не совпадают длины или высоты, не совпадают форматы и т.д., вывести внятное сообщение о проблеме в стандартный поток ошибок.
Специальные случаи:
- Изображения, отличающиеся лишь порядком хранения пикселей, считаются совпадающими.
- Изображения, отличающиеся лишь способом хранения цвета пикселей, считаются совпадающими.
- Изображения разной битности всегда считаем несовпадающими.
Использование имеет следующий вид, вызов через командную строку:
comparer image1.bmp image2.bmp0— изображения совпадают.1— некорректные аргументы командной строки, изображения несравнимы, неподдерживаемый формат, ошибки, которые относятся к структуре изображения и иные ошибки. Также необходимо вывести внятное сообщение о случившейся ошибке в стандартный поток ошибок.2— изображения не совпадают.- Других кодов возврата быть не должно.