Реализуйте программу, которая будет менять размер 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, размер которого мы хотим изменить
и третьим аргументом - название записываемого файла т.е. нового изображения с измененным размером.
если вашу программу запустили ненадлежащим образом (с меньшим или большим числом аргументов), она должна оповестить об этом пользователя, используя fprintf (с stderr). Функция 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
check50check50 cs50/2017/x/resize/less