Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы и курсачи 2022-2023 / 2 сем / Baraeva_Elizaveta_cw

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
1 Мб
Скачать
11
1.5. Дополнительные функции
1.5.1) scan_color
Функция принимает строку и массив color, преобразовывает в 3 числа типа int, проверяет, что они находятся в диапазоне от 0 до 255, записывает эти числа в массив color. Если что-то с числами не так, то выводится сообщение об ошибке.
1.5.2) scan_coordinates
Функция принимает строку и массив coord, преобразовывает в 2 числа типа int, проверяет, что они являются неотрицательными, записывает эти числа в массив coord. Если что-то с координатами не так, то выводится сообщение об ошибке.
1.5.3) scan_number
Функция принимает строку и число number, преобразовывает в число типа int, проверяет, что оно является положительным, записывает число в
number. Если что-то пошло не так, то выводится сообщение об ошибке.
1.5.4) help
Функция печатает информацию об использовании программы.
1.5.5) info
Функция печатает информацию о переданном PNG-файле.
1.5.6) read_png
Функция открывает файл, считывает из него информацию, записывает ее в структуру image и закрывает файл.
1.5.7) write_png
Функция открывает файл, записывает в него информацию из структуры image и закрывает файл.
1.6. Соглашение
Взаимодействие с программой происходит с помощью CLI (Command Line Interface). Сначала считываются основные аргументы, затем уже флаги для каждого основного аргумента. За 1 раз программа обрабатывает 1 основной
12
аргумент. Важно: все побочные аргументы должны идти строго после основного аргумента, иначе программа выведет help страницу, и обработка изображения не случится. Имя файла для обработки должно идти после своего флага --file. Однако флаг с именем файла может быть указан в любом месте после основного флага операции. В случае, если программе будут поданы не валидные аргументы для ширины, цвета и т.д. (например, строка, вместо числа), программа выведет сообщение о не валидности, и обработка произведена не будет. Пользователь может передать один флаг только один раз (за исключением -h/--help и -i/--info). Программа работает с PNG-файлами без сжатия, 24 бита на цвет.
13
2. ПРИМЕРЫ
1. Функция help см. рис. 1.
Рисунок 1 – Пример функции help
2. Функция info см. рис. 2.
Рисунок 2 – Пример функции info
3. Функция circle см. рис. 3, см. рис. 4.
./a.out -c --centre 600,320 --radius 200 --color 154,24,125 --width 70 --fill 255,255,255 --file Example.png
14
Рисунок 3 – Пример функции circle №1
./a.out --circle --start 250,250 --end 600,600 --color 34,65,165 --width 30 --file Example.png
Рисунок 4 – Пример функции circle 2
15
4. Функция filter см. рис. 5, см. рис. 6.
./a.out -f -b 255 --file Example.png
Рисунок 5 – Пример функции filter 1
./a.out --filter -g 0 --file Example.png
Рисунок 6 – Пример функции filter 2
16
5. Функция split см. рис. 7, см. рис. 8.
./a.out -s -n 2 -m 4 --color 255,84,22 --width 50 --file Example.png
Рисунок 7 – Пример функции split 1
./a.out -s -n 5 -m 7 --color 65,24,187 --width 4 --file Example.png
Рисунок 8 – Пример функции split 2
17
ЗАКЛЮЧЕНИЕ
В процессе выполнения курсовой работы была разработана программа для обработки PNG-изображений. Разработанная программа имеет интерфейс командной строки и может гибко взаимодействовать с форматом. Кроме того, на основе классических алгоритмов растеризации для отрисовки геометрических фигур были реализованы функции. Программа имеет help страницу и возможность вывода необходимой информации на экран.
18
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Язык программирования Си: монография / Б.Керниган, Д.Ритчи; Пер. с англ. под ред. В.С.Штаркмана. - 3-е изд., испр. - СПб. : Невский диалект, 2001. ­351 с.
2. Реализации алгоритмов/Алгоритм Брезенхэма – Викиучебник URL:
https://ru.wikibooks.org/wiki/Реализации_алгоритмов/Алгоритм_Брезенхэма
3. libpng-manual.txt URL: http://www.libpng.org/pub/png/libpng-manual.txt
4. Лекция по программированию URL: https://youtu.be/fCQRboLFAbg
5. Заливка – Википедия URL: https://ru.wikipedia.org/wiki/Заливка
19
ПРИЛОЖЕНИЕ А
ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: main.c
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <stdarg.h> #include <png.h> #include <getopt.h> #include <stdbool.h>
typedef struct Png{ int width, height; png_byte color_type; png_byte bit_depth;
png_structp png_ptr; png_infop info_ptr; int number_of_passes; png_bytep *row_pointers; } PNG;
bool read_png(char *file_name, PNG *image); void write_png(char *file_name, PNG *image); void filter(PNG *image, char color, int value); void split(PNG *image, int N, int M, int W, int* color); void circle(PNG* image, int* start, int* end, int* center, int r, int w, int* color, int* fill);
bool scan_color(char* str_color, int* color){ if(str_color == NULL) return false; char *end1 = NULL, *end2 = NULL, *end3 = NULL; char* c1 = strtok(str_color, ","); char* c2 = strtok(NULL, ","); char* c3 = strtok(NULL, ","); if(c1 != NULL && c2 != NULL && c3 != NULL){ color[0] = (int) strtol(c1, &end1, 10); color[1] = (int) strtol(c2, &end2, 10); color[2] = (int) strtol(c3, &end3, 10); if(*end1 == '\0' || *end2 == '\0' || *end3 == '\0'){ if(color[0] >= 0 && color[0] <= 255 && color[1] >= 0 && color[1] <= 255 && color[2] >= 0 && color[2] <= 255){ return true; } } } return false; }
bool scan_coordinates(char* str, int* coord){ if(str == NULL) return false;
20
char *end1 = NULL, *end2 = NULL; char* c1 = strtok(str, ","); char* c2 = strtok(NULL, ","); if(c1 != NULL && c2 != NULL){ coord[0] = (int) strtol(c1, &end1, 10); coord[1] = (int) strtol(c2, &end2, 10); if(*end1 == '\0' || *end2 == '\0'){ if(coord[0] >= 0 && coord[1] >= 0){ return true; } } } return false; }
bool scan_number(char* str, int* number){ if(str == NULL) return false; char* end = NULL; *number = (int) strtol(str, &end, 10); if(*end != '\0') return false; if(*number < 0) return false; return true; }
void case_filter(int argc, char* argv[]){ opterr = 0; const char* short_options = "r:g:b:"; const struct option long_options[] = { {"red", required_argument, NULL, 'r'}, {"green", required_argument, NULL, 'g'}, {"blue", required_argument, NULL, 'b'}, {"file", required_argument, NULL, 'i'}, {NULL, 0, NULL, 0}}; int rez, option_index, value = -1, sum = 0; char *file_name = NULL; char color = '0'; while((rez = getopt_long(argc, argv, short_options, long_options, &option_index)) != -1){ switch(rez){ case 'r': case 'g': case 'b': color = rez; if(optarg == NULL){ fprintf(stderr, "Неправильный ввод числа\n"); return; } char* end = NULL; value = (int) strtol(optarg, &end, 10); if(*end != '\0'){ fprintf(stderr, "Неправильный ввод числа\n"); return; } if(!(value == 255 || value == 0)){
Соседние файлы в папке 2 сем