Реализуйте программу, которая будет менять размер 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
check50
check50 cs50/2017/x/resize/less