Resize (Изменение размера)

Коротко

Реализуйте программу, которая будет менять размер BMP-изображения, как показано ниже.

$ ./resize 4 small.bmp large.bmp

Объяснение

Приступайте к решению данной проблемы только после того, как будете действительно понимать структуру 24-битного несжатого BMP-изображения, с которой вы ознакомились в Whodunit.

Развертывание

Скачивание

$ wget https://github.com/cs50/problems/archive/resize.zip
$ unzip resize.zip
$ rm resize.zip
$ mv problems-resize resize
$ cd resize
$ ls
bmp.h  copy.c  large.bmp  small.bmp  smiley.bmp

Описание

Реализуйте программу под названием resize, которая изменяет (т.е. увеличивает) размер 24-битного несжатого BMP-изображения в n раз.

Напишите программу в файле resize.c, которая будет находиться в папке resize.

Ваша программа должна принимать ровно три аргумента командной строки, где

первый аргумент (n) должен быть позитивным целым числом, меньше или равный 100,

вторым должно быть название файла BMP, размер которого мы хотим изменить

и третьим аргументом - название записываемого файла т.е. нового изображения с измененным размером.

если вашу программу запустили ненадлежащим образом (с меньшим или большим числом аргументов), она должна оповестить об этом пользователя, используя fprintfstderr). Функция main должна вернуть1.

Если ваша программа будет пользоваться функцией malloc, вы должны будете позаботиться о том, чтобы не возникло никаких утечек памяти.

Использование

Ваша программа должна проделывать тоже самое, что показано в примере ниже.

$ ./resize
Error (ошибка): ./resize n infile outfile
$ echo $?
1
$ ./resize 2 small.bmp larger.bmp
$ echo $?
0

Подсказки

С такой программой, мы могли бы создать изображение large.bmp из small.bmp путем изменения размера последнего на 4 (т.е. умножив его ширину и высоту на 4), как показано ниже.

./resize 4 small.bmp large.bmp

Вы можете начать решать задачу создав копию файла copy.c и назвав новую копию resize.c. Но сперва подумайте над тем, что означает изменить размер BMP. (Вы можете предположить, что результат умножения n на размер infile (входного файла) не превысит 232 - 1). Определите, которые поля в BITMAPFILEHEADER и BITMAPINFOHEADER вам возможно придется модифицировать (изменить). Решите, нужно ли вам добавить или убрать отступы из растровых строк изображения. И позаботьтесь о том, чтобы программа работала корректно при значении n равной 1, в таком случае размеры outfile‘а будут идентичны размерам infile‘а.

Если так случится, что вы воспользуетесь функцией malloc, не забудьте применить функцию free, дабы избежать утечки памяти. Проверить программу на наличие утечек вам поможет valgrind!

Проверка

Если вы хотите посмотреть на заголовки файла large.bmp (в более понятном виде, чем это было с xxd), вы можете выполнить следующее:

~cs50/pset4/peek large.bmp

check50

check50 cs50/2017/x/resize/less