Выделяется память под структуру FileHeader. Вызывается функция OpenFiles(). Для начала открывается входной файл в переменной Input. С помощью цикла заполняется заголовок файла с помощью структуры FileHeader. Это первые 54 байта.
Вызывается функция Width, которая определяется количество дополнительных байт в конце строки. Дополнительные байты равны остатку при делении количество бит в ширине изображения на 4.
Далее заголовок файла Input копируется в файл Output побайтово. Основная часть рисунка копируется попиксельно. Три байта записываются в массив Color и определяется цвет пикселя. Если он черный, то есть все три байта равны 0, или белый, то есть все три байта равны 255, то этот пиксель копируется. Иначе пиксель приобретает черный цвет и записывается в выходной файл. Если это конец строки, то дополнительные байты просто копируются.
Определение границ рисунка
Определение границ рисунка реализовано через два цикла. То есть рисунок попиксельно представлен как массив и хоть действия осуществляются в файле, границы определяются как будто данный рисунок представлен в виде двумерного массива. При каждом перемещении каретки меняются переменные i и j. Эти переменные сравниваются с шириной и высотой рисунки.
Определение количества областей
Это действие реализовано с помощью FindNumberOfAreas(). Проход осуществляется с самого левого нижнего пикселя по строкам слева направо. Переменная Count отвечает за количество областей. С помощью такого прохода находится белый пиксель. Данная область раскрашивается (с помощью функции Colorize()) в цвет пикселя с последним байтом равным 1. Так каждая последующая область имеет цвет на один больший, чем предыдущая область. Если этот пиксель последний в строке, то пропускаются дополнительные байты и начинается проверка следующих пикселей с начала строки. Количество областей возвращается в функцию Action и записывается в переменную Areas.