Skip to content

IDKWNTCMF/c-hw_01

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

Домашняя работа №1 (HW #1 (BMP))

Содержание

  1. Содержание
  2. Задание
  3. Требования к корректности решения
    1. Базовые требования
    2. Требования к промежуточной попытке
    3. Хранение изображения
    4. Консольное приложение
    5. Разделение обязанностей
    6. Структура репозитория
  4. Бонусное задание
    1. Способ кодирования
    2. Консольное приложение
    3. Разделение обязанностей
  5. Сроки сдачи
  6. Система оценки

Задание

Реализуйте приложение ./hw_01, которое вырезает прямоугольник из BMP-файла с изображением, поворачивает этот прямоугольник на 90 градусов по часовой стрелке и сохраняет результат в отдельный файл.

Все изображения (изначальное для чтения и сохранённый результат) хранятся в заданном формате:

  • Общий формат — BMP.
  • В рамках формата BMP используется формат DIB с заголовком BITMAPINFOHEADER (версия 3).
  • Значение поля biHeight (высота изображения) строго больше нуля.
  • Используются 24 бита цвета на пиксель (один байт на цветовой канал).
  • Палитра (таблица цветов) не используется.
  • Сжатие не используется.

Таким образом, вам требуется обработать лишь один конкретный вид BMP-файлов, не требуется поддерживать все возможности формата.

Требования к корректности решения

Базовые требования

В этом задании действуют стандартные и дополнительные требования:

  • Программа обязана проверить корректность аргументов (см. консольное приложение).
    • Достаточно проверить относительно тривиальные ошибки: выход за границы изображения и нехватку аргументов.
    • Если один из аргументов оказывается не-числом вместо числа, поведение программы не определено (т.е. вам не требуется это обрабатывать).
  • При проблемах с аргументами, открытием файла, выделением памяти и прочим, программа должна корректно завершить работу и вернуть ненулевой код возврата.
  • Тесты реализовывать не требуется.

Требования к промежуточной попытке

  • Поведение программы не определено, если либо входное, либо выходное изображение не является квадратом со стороной, делящейся на 4.
  • Отклонения от формата не допускаются.
  • Допускается отсутствие проверок аргументов.
  • Допускаются утечки памяти, неидеальное разделение по файлам.
  • Нельзя UB (но на усмотрение преподавателя иногда можно, уточняйте).

Хранение изображения

В качестве примера входного файла вам даны изображения lena_512.bmp и small-one.bmp. Также некоторые графические редакторы могут генерировать изображение в нужном формате («24-битное изображение BMP»), проверяйте поля в заголовках.

Гарантируется, что требования ниже выполняются для входного файла (в противном случае поведение вашей программы не определено):

  1. Если файл существует, то он строго следует формату.
  2. Файл помещается в память целиком с запасом хотя бы в три раза.

Требования к сохранённому изображению:

  1. Сохранённое изображение должно содержать ту же информацию в заголовках, что и исходное изображение, кроме необоходимых для изменения (например, размеры).
  2. При необходимости выравнивания данных, дописывайте именно нули.

Подсказки:

  1. Убедитесь, что вы корректно работаете с неквадратными изображениями.
  2. Убедитесь, что вы корректно работаете с изображениями со стороной, не делящейся на 4 (и при чтении, и при записи).
  3. Убедитесь, что вы открываете файл в режиме для бинарного ввода-вывода (rb и wb вместо r и w), это влияет на корректность под Windows и на баллы за корректность.

Консольное приложение

Приложение запускается следующей командой:

./hw_01 crop-rotate ‹in-bmp› ‹out-bmp› ‹x› ‹y› ‹w› ‹h›

Используемые параметры:

  • crop-rotate — обязательный параметр, означающий выполняемое действие.
  • in-bmp — имя входного файла с изображением.
  • out-bmp — имя выходного файла с изображением.
  • x, y — координаты левого верхнего угла области, которую необходимо вырезать и повернуть. Координаты начинаются с нуля, таким образом (0, 0) — это верхний левый угол.
  • w, h — соотвественно, ширина и высота области до поворота.

Таким образом, если обозначить ширину и высоту исходного изображения за W и H, соответственно, верны следующие неравенства:

  • 0 <= x < x + w <= W
  • 0 <= y < y + h <= H

Разделение обязанностей

  • Файлы bmp.c и bmp.h должны содержать работу с изображением, а именно функции:
    1. load_bmp (заргузка изображения).
    2. crop (вырезание фрагмента).
    3. rotate (поворот).
    4. save_bmp (сохранение изображения).
  • Работу с аргументами и точку входа реализовать в main.c.

Структура репозитория

Если вам нужны дополнительные файлы (например, тестовые изображения), кладите их в папку samples.

<корень-личного-репозитория>
|--hw_01
   |--include
   |  |-- bmp.h
   |--samples
   |  |-- test.bmp
   |--src
   |  |-- bmp.c
   |  |-- main.c
   |--Makefile

Папку obj, объектные и исполняемые файлы класть в репозиторий не разрешается.

Бонусное задание

В дополнение к команде crop-rotate реализуйте команды insert и extract, позволяющие спрятать внутри изображения сообщение (стеганография). Команда insert сохраняет в изображение сообщение, а extract — извлекает его оттуда.

Идея следующая: если менять только самые младшие биты в цветовых компонентах, то сторонний наблюдатель не заметит искажения. Этим искажением можно скрыто передавать информацию.

Способ кодирования

Исходное сообщение состоит только из заглавных латинских букв, пробела, точки и запятой. Каждый символ преобразовывается в число от 0 до 28, соответственно (всего 29 различных значений), а число — в пять бит, записанных от младших к старшим. Всего сообщение из N символов кодируется при помощи 5N Бит.

Для передачи сообщения, помимо изображения-носителя, потребуется ключ — текстовый файл, описывающий, в каких пикселях кодируются биты сообщения. В этом файле на отдельных строчках записаны:

  • Координаты x и y (0 <= x < W, 0 <= y < H) пикселя, в который надо сохранить соответствующий бит.
  • Буква R/G/B обозначающая цветовой канал, в младшем бите которого требуется записать бит сообщения.

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

Консольное приложение

Для сохранения секретной строчки в изображение приложение запускается следующей командой:

./hw_01 insert ‹in-bmp› ‹out-bmp› ‹key-txt› ‹msg-txt›

Для извлечения секретной строчки из изображения приложение запускается следующей командой:

./hw_01 extract ‹in-bmp› ‹key-txt› ‹msg-txt›

Используемые параметры:

  • in-bmp — имя входного файла с изображением.
  • out-bmp — имя выходного файла с изображением.
  • key-txt — тестовый файл с ключом.
  • msg-txt — текстовый файл с секретным сообщением.

При этом остаются все остальные требования корректности: команда crop-rotate, проверка аргументов и прочие.

Разделение обязанностей

Реализуйте функции для стеганографии в отдельных файлах stego.h/stego.c.

Сроки сдачи

Задание выдано 10.12.2020 (четверг). На задание даётся ровно три попытки сдачи со следующими сроками сдачи:

  1. 19.12.2020 23:59 по Москве — первый срок сдачи.
  2. 24.12.2020 23:59 по Москве — крайний срок сдачи. (требуется выполнить требования к промежуточной попытке, чтобы получить возможность сдавать до крайнего срока).

Учтите, что в отличие от лабораторных:

  • Это домашнее задание больше по сложности и объёму кода. Пожалуйста, не откладывайте даже до промежуточного срока сдачи.
  • Вы можете сделать не больше трёх полноценных попыток за всё время сдачи. На усмотрение преподавателя могут добавляться промежуточные попытки, которые будут проверяться частично.
  • Вам требуется корректно выставлять и обновлять поле Version в тикете в зависимости от номера попытки сдачи. Полноценная проверка начинается только после увеличения поля Version.
  • Из-за объёма кода решения могут проверяться с существенной задержкой, особенно при наличии стилистических замечаний.

Система оценки

  • Задание оценивается в 30 баллов: 20 за корректность, 10 за стиль.
  • Вы можете получить ещё +10 баллов за бонусное задание, итого 40.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published