CourseWork - Auhadiev/Scorp GitHub Wiki
ВВЕДЕНИЕ
Цель работы. Разработка программы на языке программирования С для считывания и обработки изображения в формате png с использованием CLI. Задачи. • Изучение синтаксиса языка программирования C (библиотеки libpng.h и getopt.h). • Написание исходного кода. • Тестирование программы.
1. Исходное задание
Общие сведения • без сжатия • файл всегда соответствует формату PNG • обратите внимание на выравнивание; мусорные данные, если их необходимо дописать в файл для выравнивания, должны быть нулями. • все поля стандартных PNG заголовков в выходном файле должны иметь те же значения что и во входном (разумеется кроме тех, которые должны быть изменены). Программа должна реализовывать следующий функционал по обработке PNG-файла • (1) Инверсия цвета в заданной области. Функционал определяется ◦ Координатами левого верхнего угла области ◦ Координатами правого нижнего угла области • (2) Преобразовать в Ч/Б изображение (любым простым способом). Функционал определяется ◦ Координатами левого верхнего угла области ◦ Координатами правого нижнего угла области ◦ Алгоритмом, если реализовано несколько алгоритмов преобразования изображения (по желанию студента) • (3) Изменение размера изображения с его обрезкой или расширением фона. Функционал определяется: ◦ Действием: увеличение или уменьшение изображения ◦ Цветом фона при увеличении изображения ◦ Точкой относительно которой производится действие: центр, левый верхний, правый верхний, левый нижний, правый нижний угол.
2. ФУНКЦИЯ MAIN() и заголовочный файл structures.h
В заголовочном файле structures.h подключены все необходимые библиотеки, определены структура GlobalArguments, строка коротких опций optString и массив структур опций longOpts[] для работы с длинными и короткими опциями для обработки команд пользователя, структура PNG для хранения изображения. В функции main() происходит обработка введённых пользователем опций в цикле с помощью функции getopt_long() и switch-блока со считыванием аргументов, выставлением необходимых флагов и обработкой возможных ошибок. В случае какой-либо ошибки выводится сообщение об ошибке или справочные данные о работе с программой. Для проверки корректности введённых данных используются функции isValid() для проверки корректности введённого цвета и isDigit() для проверки корректности введённых целых чисел. После этого происходит считывание изображения с помощью функции read_png_file() из файла (последний переданный аргумент), по выставленным флагам вызывается нужная функция для его обработки, после чего изменённое изображение сохраняется в тот же файл с помощью функции write_png_file().
3. Функции считывания и записи файла
3.1. Функция int read_png_file() В функции read_png_file() происходит считывания информации из файла и запись в экземпляр структуры Png. Функция использует библиотеку libpng и создает буферный массив для удобной работы с изображением. Также функция обрабатывает исключительные ситуации. В случае ошибки выводится сообщение и функция возвращает 1. 3.2. Функции void write_png_file() и void cleanMemory() В функции write_png_file() происходит запись изображения в файл с помощью функций библиотеки libpng с обработкой исключительных ситуаций. В функции cleanMemory() происходит высвобождение выделенной ранее памяти под двумерный массив байтов row_pointers экземпляра структуры PNG. 4. функции для обработки изображения
4.1. Функция инверсии цвета в заданной области void inversion()
Функция принимает указатель на экземпляр структуры PNG (само изображение), координаты левого верхнего угла и правого нижнего угла прямоугольной области.
При выходе за границу картинки выводится сообщение, но функция продолжает работать в границах изображения. В случае, если изображение имеет тип цвета RGB, а не RGBA, функция выводит сообщение и прекращает работу.
Затем с помощью вложенного цикла for и оператора "~" происходит инверсия цвета пикселей изображения.
4.2. Функция преобразования в чёрно-белое указанной области void blackWhite()
Функция принимает указатель на экземпляр структуры PNG (само изображение), координаты левого верхнего угла и правого нижнего угла прямоугольной области.
При выходе за границу картинки выводится сообщение, но функция продолжает работать в границах изображения. В случае, если изображение имеет тип цвета RGB, а не RGBA, функция выводит сообщение и прекращает работу.
Затем с помощью вложенного цикла for находится среднее арифметическое первых трёх байтов пикселей, которое после присваивается каждому из этих байтов, в результате чего изображение преобразовывается в чёрно-белое.
4.3. Функция обрезки изображение void cut()
Функция принимает указатель на экземпляр структуры PNG (само изображение), точку, относительно которой происходит обрезка и новые значения ширины и высоты изображения.
В зависимости от значения точки в switch-блоке выставляются значения смещения изображения при обрезке.
Выделяется память под новый буфер, в который копируются пиксели изображения, после чего память, выделенная под пиксели, которые будут обрезаны, высвобождается с помощью функции realloc().
Затем из буфера в обрезанное изображение копируются пиксели с нужным сдвигом, зависящим от точки, относительно которой происходит обрезка. После этого буфер очищается, а значения ширины и высоты изображения приобретают новые значения.
4.4. Функция расширения изображения с заливкой фона expand()
Функция принимает указатель на экземпляр структуры PNG (само изображение), точку, относительно которой происходит увеличение, новые значения ширины и высоты изображения и цвет для заливки фона.
В зависимости от значения точки в switch-блоке выставляются значения смещения изображения при увеличении
Выделяется память под новый буфер, в который копируются пиксели изображения, после чего память, выделенная под хранение пикселей изображения, увеличивается до новых размеров, а сами пиксели перекрашиваются в новый цвет.
Затем из буфера в увеличенное изображение копируются пиксели с нужным сдвигом, зависящим от точки, относительно которой происходит увеличение. После этого буфер очищается, а значения ширины и высоты изображения приобретают новые значения.
- Функции printHelp() и Printinfo() Функция void printHelp() выводит инструкцию для работы с программой с описанием всех ключей и возможностей. Функция void printInfo() принимает ссылку на экземпляр структуры PNG и выводит значения ширины и высоты изображения, глубины и типа цвета.