Advertisement
Guest User

Untitled

a guest
May 25th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.29 KB | None | 0 0
  1. struct args{
  2.  
  3. int start[2];
  4. int end[2];
  5. int nevv[2];
  6. int origin[4];
  7. int chosen[4];
  8. int width;
  9. int type;
  10. };
  11.  
  12. void printHelp()
  13. {
  14. printf("Справка\n");
  15. printf("--copy(-c) - делает копию заданного участка. Участок задается при помощи -S и -E области-источника и -N области-назначения.\n");
  16. printf("(Пример) --copy -S 100 200 -E 500 600 -N 0 0 fileOut.png");
  17. printf("--swap_color(-s) - Заменяет все пиксели одного заданного цвета на другой цвет. Цвет задается в формате RGB. -O(буква) для исходного цвета и (-C) для нового.\n");
  18. printf("(Пример) --swap_color -O 125 10 30 -C 200 162 3 fileOut.png\n");
  19. printf("--frame(-f) - Делает рамку в виде узора. Цвет задается при помощи -C, а ширина узора - -W, а тип рамки при помощи -T. \n");
  20. printf("(Пример) --frame -C 124 32 0 -W 30 -T 2 fileOut.png\n");
  21. printf("--highlight_rect(-h) - Поиск всех залитых прямоугольников заданного цвета. Задается цвет прямоугольников -O, цвет обводки -C, толщина линии -W.\n");
  22. printf("(Пример) --highlight_rect -R 100 156 200 -F 0 0 0 -W 5 fileOut.png\n");
  23. printf("--start(-S) - считывет координаты *целый числа* верхнего левого угла прямоугольной области (-С 32 23)\n");
  24. printf("--end(-E) - считывет координаты *целый числа* нижнего правого угла прямоугольной области (-E 32 23)\n");
  25. printf("--new(-N) - считывет координаты *целый числа* верхнего левого угла области-назначения (-N 0 0)\n");
  26. printf("--origin(-O) - считывет исходный цвет в формате RGB (-O 125 25 86)\n");
  27. printf("--chosen(-C) - считывет выбранный цвет в формате RGB (-C 0 25 86)\n");
  28. printf("--width(-W) - считывает значение ширины в пикселях (-W 10)\n");
  29. printf("--type(-T) - считывает тип рамки (всего возможно 3 типа). По умолчанию стоит рамка с типом 1.\n");
  30. printf("--info(-i) - выводит информацию о входном файле\n");
  31. printf("Строка команд должна заканчиваться названием файла вывода\n");
  32. }
  33.  
  34. int isNumber(char *n)
  35. {
  36. for(int i = 0; i < strlen(n); i++)
  37. if(!isdigit(n[i]))
  38. return 0;
  39. return 1;
  40. }
  41.  
  42. int main(int argc, char **argv) {
  43.  
  44. srand(time(NULL));
  45.  
  46. struct Png image;
  47.  
  48. struct args arg;
  49. int longIndex = 0;
  50. int opt = 0;
  51. int flag = 0;
  52.  
  53. read_png_file(argv[1], &image);
  54.  
  55. arg.end[0] = -1;
  56. arg.end[1] = -1;
  57. arg.start[0] = -1;
  58. arg.start[1] = -1;
  59. arg.width = -1;
  60. arg.origin[0] = -1;
  61. arg.origin[1] = -1;
  62. arg.origin[2] = -1;
  63. arg.origin[3] = -1;
  64. arg.chosen[0] = -1;
  65. arg.chosen[1] = -1;
  66. arg.chosen[2] = -1;
  67. arg.chosen[3] = -1;
  68. arg.type = 1;
  69.  
  70. char optstring[22] = "csfhS:E:N:O:C:W:T:in";
  71.  
  72. struct option longOpts[] = {
  73. {"swap_color", no_argument, &flag, 's'},
  74. {"copy", no_argument, &flag, 'c'},
  75. {"frame", no_argument, &flag, 'f'},
  76. {"highlight_rect", no_argument, &flag, 'h'},
  77. {"note", required_argument, &flag, 'n'},
  78. {"start", required_argument, NULL, 'S'},
  79. {"end", required_argument, NULL, 'E'},
  80. {"new", required_argument, NULL, 'N'},
  81. {"origin", required_argument, NULL, 'O'},
  82. {"width", required_argument, NULL, 'W'},
  83. {"chosen", required_argument, NULL, 'C'},
  84. {"type", required_argument, NULL, 'T'},
  85. {"info", required_argument, &flag, 'i'},
  86. {NULL, 0, NULL, 0}
  87. };
  88.  
  89. opt = getopt_long(argc, argv, optstring , longOpts, &longIndex);
  90.  
  91. while( opt != -1 ) {
  92. switch(opt) {
  93. case 'E':
  94. if(!isNumber(optarg))
  95. {
  96. printf("Ошибка! Не корректно введены аргументы для флага -E! %s - не целое число!\n", optarg);
  97. return 0;
  98. }
  99. if(!isNumber(argv[optind]))
  100. {
  101. printf("Ошибка! Не корректно введены аргументы для флага -E! %s - не целое число!\n", argv[optind]);
  102. return 0;
  103. }
  104. arg.end[0] = atoi(optarg);
  105. arg.end[1] = atoi(argv[optind]);
  106. break;
  107.  
  108. case 'T':
  109. if(!isNumber(optarg))
  110. {
  111. printf("Ошибка! Не корректно введены аргументы для флага -T! %s - не целое число!\n", optarg);
  112. return 0;
  113. }
  114. if (atoi(optarg) < 0 || atoi(optarg) > 3) {
  115. printf("Ошибка! %s - такого типа рамки не существует!\n", optarg);
  116. return 0;
  117. }
  118. arg.type = atoi(optarg);
  119. break;
  120.  
  121. case 'S':
  122. if(!isNumber(optarg))
  123. {
  124. printf("Ошибка! Не корректно введены аргументы для флага -S! %s - не целое число!\n", optarg);
  125. return 0;
  126. }
  127. if(!isNumber(argv[optind]))
  128. {
  129. printf("Ошибка! Не корректно введены аргументы для флага -S! %s - не целое число!\n", argv[optind]);
  130. return 0;
  131. }
  132. arg.start[0] = atoi(optarg);
  133. arg.start[1] = atoi(argv[optind]);
  134. break;
  135.  
  136. case 'N':
  137. if(!isNumber(optarg))
  138. {
  139. printf("Ошибка! Не корректно введены аргументы для флага -N! %s - не целое число!\n", optarg);
  140. return 0;
  141. }
  142. if(!isNumber(argv[optind]))
  143. {
  144. printf("Ошибка! Не корректно введены аргументы для флага -N! %s - не целое число!\n", argv[optind]);
  145. return 0;
  146. }
  147. arg.nevv[0] = atoi(optarg);
  148. arg.nevv[1] = atoi(argv[optind]);
  149. break;
  150.  
  151. case 'W':
  152. if(!isNumber(optarg))
  153. {
  154. printf("Ошибка! Не корректно введены аргументы для флага -W! %s - не целое число!\n", optarg);
  155. return 0;
  156. }
  157. if (atoi(optarg) >= MIN(image.width, image.height) / 4 || atoi(optarg) < 0) {
  158. printf("Ошибка! Слишком большая ширина узора рамки или она меньше нуля.\n");
  159. return 0;
  160. }
  161. arg.width = atoi(optarg);
  162. break;
  163.  
  164. case 'O':
  165. if(!isNumber(optarg))
  166. {
  167. printf("Ошибка! Не корректно введены аргументы для флага -O! %s - не целое число!\n", optarg);
  168. return 0;
  169. }
  170. if(!isNumber(argv[optind]))
  171. {
  172. printf("Ошибка! Не корректно введены аргументы для флага -O! %s - не целое число!\n", argv[optind]);
  173. return 0;
  174. }
  175. if(!isNumber(argv[optind]))
  176. {
  177. printf("Ошибка! Не корректно введены аргументы для флага -O! %s - не целое число!\n", argv[optind + 1]);
  178. return 0;
  179. }
  180. if (atoi(optarg) > 255 || atoi(argv[optind]) > 255 || atoi(argv[optind + 1]) > 255
  181. || atoi(optarg) < 0 || atoi(argv[optind]) < 0 || atoi(argv[optind + 1]) < 0)
  182. {
  183. printf("Ошибка! Такого цвета не существует!\n");
  184. return 0;
  185. }
  186. arg.origin[0] = atoi(optarg);
  187. arg.origin[1] = atoi(argv[optind]);
  188. arg.origin[2] = atoi(argv[optind + 1]);
  189. break;
  190.  
  191. case 'C':
  192. if(!isNumber(optarg))
  193. {
  194. printf("Ошибка! Не корректно введены аргументы для флага -C! %s - не целое число!\n", optarg);
  195. return 0;
  196. }
  197. if(!isNumber(argv[optind]))
  198. {
  199. printf("Ошибка! Не корректно введены аргументы для флага -C! %s - не целое число!\n", argv[optind]);
  200. return 0;
  201. }
  202. if(!isNumber(argv[optind]))
  203. {
  204. printf("Ошибка! Не корректно введены аргументы для флага -C! %s - не целое число!\n", argv[optind + 1]);
  205. return 0;
  206. }
  207. if (atoi(optarg) > 255 || atoi(argv[optind]) > 255 || atoi(argv[optind + 1]) > 255
  208. || atoi(optarg) < 0 || atoi(argv[optind]) < 0 || atoi(argv[optind + 1]) < 0)
  209. {
  210. printf("Ошибка! Такого цвета не существует!\n");
  211. return 0;
  212. }
  213. arg.chosen[0] = atoi(optarg);
  214. arg.chosen[1] = atoi(argv[optind]);
  215. arg.chosen[2] = atoi(argv[optind + 1]);
  216. break;
  217.  
  218. case 'n':
  219. printHelp();
  220. break;
  221.  
  222. case 'i':
  223. flag = 'i';
  224. break;
  225.  
  226. case 's':
  227. flag = 's';
  228. break;
  229.  
  230. case 'c':
  231. flag = 'c';
  232. break;
  233.  
  234. case 'f':
  235. flag = 'f';
  236. break;
  237.  
  238. case 'h':
  239. flag = 'h';
  240. break;
  241. default:
  242. printf("Такого флага не существует!\n");
  243. return 0;
  244. }
  245.  
  246. opt = getopt_long(argc, argv, optstring , longOpts, &longIndex);
  247.  
  248. }
  249.  
  250. switch(flag){
  251.  
  252. case'c':
  253. if (arg.start[0] == -1 || arg.start[1] == -1 || arg.end[0] == -1 || arg.end[1] == -1 ||
  254. arg.nevv[0] == -1 || arg.nevv[1] == -1) {
  255. printf("Неправильно заданы аргументы!\n");
  256. break;
  257. }
  258. if(arg.start[0] < 0 || arg.start[0] > image.width ||
  259. arg.start[1] < 0 || arg.start[1] > image.height ||
  260. arg.end[0] > image.width || arg.end[0] < 0 ||
  261. arg.end[1] > image.height || arg.end[1] < 0 ||
  262. arg.start[0] > arg.end[0] ||
  263. arg.start[1] > arg.end[1] ||
  264. arg.nevv[0] < 0 || arg.nevv[1] < 0 ||
  265. arg.nevv[0] > image.width || arg.nevv[1] > image.height)
  266. {
  267. printf("Область копирования не является корректной\n");
  268. break;
  269. }
  270. else
  271. {
  272. copyAndPaste(&image, arg.start[0], arg.start[1], arg.end[0], arg.end[1], arg.nevv[0], arg.nevv[1]);
  273. }
  274. break;
  275.  
  276. case 'f':
  277. if (arg.chosen[0] == -1 || arg.chosen[1] == -1 || arg.chosen[2] == -1 || arg.width == -1) {
  278. printf("Неправильно заданы аргументы!\n");
  279. break;
  280. }
  281. drawFrame(&image, arg.chosen[0], arg.chosen[1], arg.chosen[2], arg.width, arg.type);
  282. break;
  283.  
  284. case 's':
  285. if (arg.chosen[0] == -1 || arg.chosen[1] == -1 || arg.chosen[2] == -1
  286. || arg.origin[0] == -1 || arg.origin[1] == -1 || arg.origin[2] == -1) {
  287. printf("Неправильно заданы аргументы!\n");
  288. break;
  289. }
  290. swap_colors(&image, arg.origin[0], arg.origin[1], arg.origin[2], arg.chosen[0], arg.chosen[1], arg.chosen[2]);
  291. break;
  292.  
  293. case 'n':
  294. printHelp();
  295. break;
  296.  
  297. case 'i':
  298. printf("Width = %d\n", image.width);
  299. printf("Heigth = %d\n", image.height);
  300. break;
  301.  
  302. case 'h':
  303. if (arg.chosen[0] == -1 || arg.chosen[1] == -1 || arg.chosen[2] == -1
  304. || arg.origin[0] == -1 || arg.origin[1] == -1 || arg.origin[2] == -1 || arg.width == -1) {
  305. printf("Неправильно заданы аргументы!\n");
  306. break;
  307. }
  308. png_byte *that_ptr = (png_byte *)malloc(sizeof(png_byte)*4);
  309. png_byte *on_ptr = (png_byte *)malloc(sizeof(png_byte)*4);
  310. png_byte *tptr = &(that_ptr[0]);
  311. png_byte *onptr = &(on_ptr[0]);
  312. tptr[0] = (png_byte)(arg.origin[0]);
  313. tptr[1] = (png_byte)(arg.origin[1]);
  314. tptr[2] = (png_byte)(arg.origin[2]);
  315. tptr[3] = 255;
  316. onptr[0] = (png_byte)(arg.chosen[0]);
  317. onptr[1] = (png_byte)(arg.chosen[1]);
  318. onptr[2] = (png_byte)(arg.chosen[2]);
  319. onptr[3] = 255;
  320. find_rectangle(tptr, onptr, arg.width, &image);
  321. break;
  322. }
  323. write_png_file(argv[argc - 1], &image);
  324.  
  325. return 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement