Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct args{
- int start[2];
- int end[2];
- int nevv[2];
- int origin[4];
- int chosen[4];
- int width;
- int type;
- };
- void printHelp()
- {
- printf("Справка\n");
- printf("--copy(-c) - делает копию заданного участка. Участок задается при помощи -S и -E области-источника и -N области-назначения.\n");
- printf("(Пример) --copy -S 100 200 -E 500 600 -N 0 0 fileOut.png");
- printf("--swap_color(-s) - Заменяет все пиксели одного заданного цвета на другой цвет. Цвет задается в формате RGB. -O(буква) для исходного цвета и (-C) для нового.\n");
- printf("(Пример) --swap_color -O 125 10 30 -C 200 162 3 fileOut.png\n");
- printf("--frame(-f) - Делает рамку в виде узора. Цвет задается при помощи -C, а ширина узора - -W, а тип рамки при помощи -T. \n");
- printf("(Пример) --frame -C 124 32 0 -W 30 -T 2 fileOut.png\n");
- printf("--highlight_rect(-h) - Поиск всех залитых прямоугольников заданного цвета. Задается цвет прямоугольников -O, цвет обводки -C, толщина линии -W.\n");
- printf("(Пример) --highlight_rect -R 100 156 200 -F 0 0 0 -W 5 fileOut.png\n");
- printf("--start(-S) - считывет координаты *целый числа* верхнего левого угла прямоугольной области (-С 32 23)\n");
- printf("--end(-E) - считывет координаты *целый числа* нижнего правого угла прямоугольной области (-E 32 23)\n");
- printf("--new(-N) - считывет координаты *целый числа* верхнего левого угла области-назначения (-N 0 0)\n");
- printf("--origin(-O) - считывет исходный цвет в формате RGB (-O 125 25 86)\n");
- printf("--chosen(-C) - считывет выбранный цвет в формате RGB (-C 0 25 86)\n");
- printf("--width(-W) - считывает значение ширины в пикселях (-W 10)\n");
- printf("--type(-T) - считывает тип рамки (всего возможно 3 типа). По умолчанию стоит рамка с типом 1.\n");
- printf("--info(-i) - выводит информацию о входном файле\n");
- printf("Строка команд должна заканчиваться названием файла вывода\n");
- }
- int isNumber(char *n)
- {
- for(int i = 0; i < strlen(n); i++)
- if(!isdigit(n[i]))
- return 0;
- return 1;
- }
- int main(int argc, char **argv) {
- srand(time(NULL));
- struct Png image;
- struct args arg;
- int longIndex = 0;
- int opt = 0;
- int flag = 0;
- read_png_file(argv[1], &image);
- arg.end[0] = -1;
- arg.end[1] = -1;
- arg.start[0] = -1;
- arg.start[1] = -1;
- arg.width = -1;
- arg.origin[0] = -1;
- arg.origin[1] = -1;
- arg.origin[2] = -1;
- arg.origin[3] = -1;
- arg.chosen[0] = -1;
- arg.chosen[1] = -1;
- arg.chosen[2] = -1;
- arg.chosen[3] = -1;
- arg.type = 1;
- char optstring[22] = "csfhS:E:N:O:C:W:T:in";
- struct option longOpts[] = {
- {"swap_color", no_argument, &flag, 's'},
- {"copy", no_argument, &flag, 'c'},
- {"frame", no_argument, &flag, 'f'},
- {"highlight_rect", no_argument, &flag, 'h'},
- {"note", required_argument, &flag, 'n'},
- {"start", required_argument, NULL, 'S'},
- {"end", required_argument, NULL, 'E'},
- {"new", required_argument, NULL, 'N'},
- {"origin", required_argument, NULL, 'O'},
- {"width", required_argument, NULL, 'W'},
- {"chosen", required_argument, NULL, 'C'},
- {"type", required_argument, NULL, 'T'},
- {"info", required_argument, &flag, 'i'},
- {NULL, 0, NULL, 0}
- };
- opt = getopt_long(argc, argv, optstring , longOpts, &longIndex);
- while( opt != -1 ) {
- switch(opt) {
- case 'E':
- if(!isNumber(optarg))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -E! %s - не целое число!\n", optarg);
- return 0;
- }
- if(!isNumber(argv[optind]))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -E! %s - не целое число!\n", argv[optind]);
- return 0;
- }
- arg.end[0] = atoi(optarg);
- arg.end[1] = atoi(argv[optind]);
- break;
- case 'T':
- if(!isNumber(optarg))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -T! %s - не целое число!\n", optarg);
- return 0;
- }
- if (atoi(optarg) < 0 || atoi(optarg) > 3) {
- printf("Ошибка! %s - такого типа рамки не существует!\n", optarg);
- return 0;
- }
- arg.type = atoi(optarg);
- break;
- case 'S':
- if(!isNumber(optarg))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -S! %s - не целое число!\n", optarg);
- return 0;
- }
- if(!isNumber(argv[optind]))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -S! %s - не целое число!\n", argv[optind]);
- return 0;
- }
- arg.start[0] = atoi(optarg);
- arg.start[1] = atoi(argv[optind]);
- break;
- case 'N':
- if(!isNumber(optarg))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -N! %s - не целое число!\n", optarg);
- return 0;
- }
- if(!isNumber(argv[optind]))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -N! %s - не целое число!\n", argv[optind]);
- return 0;
- }
- arg.nevv[0] = atoi(optarg);
- arg.nevv[1] = atoi(argv[optind]);
- break;
- case 'W':
- if(!isNumber(optarg))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -W! %s - не целое число!\n", optarg);
- return 0;
- }
- if (atoi(optarg) >= MIN(image.width, image.height) / 4 || atoi(optarg) < 0) {
- printf("Ошибка! Слишком большая ширина узора рамки или она меньше нуля.\n");
- return 0;
- }
- arg.width = atoi(optarg);
- break;
- case 'O':
- if(!isNumber(optarg))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -O! %s - не целое число!\n", optarg);
- return 0;
- }
- if(!isNumber(argv[optind]))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -O! %s - не целое число!\n", argv[optind]);
- return 0;
- }
- if(!isNumber(argv[optind]))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -O! %s - не целое число!\n", argv[optind + 1]);
- return 0;
- }
- if (atoi(optarg) > 255 || atoi(argv[optind]) > 255 || atoi(argv[optind + 1]) > 255
- || atoi(optarg) < 0 || atoi(argv[optind]) < 0 || atoi(argv[optind + 1]) < 0)
- {
- printf("Ошибка! Такого цвета не существует!\n");
- return 0;
- }
- arg.origin[0] = atoi(optarg);
- arg.origin[1] = atoi(argv[optind]);
- arg.origin[2] = atoi(argv[optind + 1]);
- break;
- case 'C':
- if(!isNumber(optarg))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -C! %s - не целое число!\n", optarg);
- return 0;
- }
- if(!isNumber(argv[optind]))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -C! %s - не целое число!\n", argv[optind]);
- return 0;
- }
- if(!isNumber(argv[optind]))
- {
- printf("Ошибка! Не корректно введены аргументы для флага -C! %s - не целое число!\n", argv[optind + 1]);
- return 0;
- }
- if (atoi(optarg) > 255 || atoi(argv[optind]) > 255 || atoi(argv[optind + 1]) > 255
- || atoi(optarg) < 0 || atoi(argv[optind]) < 0 || atoi(argv[optind + 1]) < 0)
- {
- printf("Ошибка! Такого цвета не существует!\n");
- return 0;
- }
- arg.chosen[0] = atoi(optarg);
- arg.chosen[1] = atoi(argv[optind]);
- arg.chosen[2] = atoi(argv[optind + 1]);
- break;
- case 'n':
- printHelp();
- break;
- case 'i':
- flag = 'i';
- break;
- case 's':
- flag = 's';
- break;
- case 'c':
- flag = 'c';
- break;
- case 'f':
- flag = 'f';
- break;
- case 'h':
- flag = 'h';
- break;
- default:
- printf("Такого флага не существует!\n");
- return 0;
- }
- opt = getopt_long(argc, argv, optstring , longOpts, &longIndex);
- }
- switch(flag){
- case'c':
- if (arg.start[0] == -1 || arg.start[1] == -1 || arg.end[0] == -1 || arg.end[1] == -1 ||
- arg.nevv[0] == -1 || arg.nevv[1] == -1) {
- printf("Неправильно заданы аргументы!\n");
- break;
- }
- if(arg.start[0] < 0 || arg.start[0] > image.width ||
- arg.start[1] < 0 || arg.start[1] > image.height ||
- arg.end[0] > image.width || arg.end[0] < 0 ||
- arg.end[1] > image.height || arg.end[1] < 0 ||
- arg.start[0] > arg.end[0] ||
- arg.start[1] > arg.end[1] ||
- arg.nevv[0] < 0 || arg.nevv[1] < 0 ||
- arg.nevv[0] > image.width || arg.nevv[1] > image.height)
- {
- printf("Область копирования не является корректной\n");
- break;
- }
- else
- {
- copyAndPaste(&image, arg.start[0], arg.start[1], arg.end[0], arg.end[1], arg.nevv[0], arg.nevv[1]);
- }
- break;
- case 'f':
- if (arg.chosen[0] == -1 || arg.chosen[1] == -1 || arg.chosen[2] == -1 || arg.width == -1) {
- printf("Неправильно заданы аргументы!\n");
- break;
- }
- drawFrame(&image, arg.chosen[0], arg.chosen[1], arg.chosen[2], arg.width, arg.type);
- break;
- case 's':
- if (arg.chosen[0] == -1 || arg.chosen[1] == -1 || arg.chosen[2] == -1
- || arg.origin[0] == -1 || arg.origin[1] == -1 || arg.origin[2] == -1) {
- printf("Неправильно заданы аргументы!\n");
- break;
- }
- swap_colors(&image, arg.origin[0], arg.origin[1], arg.origin[2], arg.chosen[0], arg.chosen[1], arg.chosen[2]);
- break;
- case 'n':
- printHelp();
- break;
- case 'i':
- printf("Width = %d\n", image.width);
- printf("Heigth = %d\n", image.height);
- break;
- case 'h':
- if (arg.chosen[0] == -1 || arg.chosen[1] == -1 || arg.chosen[2] == -1
- || arg.origin[0] == -1 || arg.origin[1] == -1 || arg.origin[2] == -1 || arg.width == -1) {
- printf("Неправильно заданы аргументы!\n");
- break;
- }
- png_byte *that_ptr = (png_byte *)malloc(sizeof(png_byte)*4);
- png_byte *on_ptr = (png_byte *)malloc(sizeof(png_byte)*4);
- png_byte *tptr = &(that_ptr[0]);
- png_byte *onptr = &(on_ptr[0]);
- tptr[0] = (png_byte)(arg.origin[0]);
- tptr[1] = (png_byte)(arg.origin[1]);
- tptr[2] = (png_byte)(arg.origin[2]);
- tptr[3] = 255;
- onptr[0] = (png_byte)(arg.chosen[0]);
- onptr[1] = (png_byte)(arg.chosen[1]);
- onptr[2] = (png_byte)(arg.chosen[2]);
- onptr[3] = 255;
- find_rectangle(tptr, onptr, arg.width, &image);
- break;
- }
- write_png_file(argv[argc - 1], &image);
- return 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement