Advertisement
Guest User

Untitled

a guest
Feb 20th, 2020
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.78 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. struct Header {
  9. char head[2];
  10. int width;
  11. int height;
  12. int total;
  13. };
  14.  
  15. class P5 {
  16. private:
  17. char **data;
  18. char **temp;
  19.  
  20. public:
  21. P5(Header &header, ifstream &cin) {
  22. data = new char*[header.height];
  23. for (int i = 0; i < header.height; i++)
  24. data[i] = new char[header.width];
  25.  
  26. char p;
  27. cin.read(&p, 1);
  28. for (int i = 0; i < header.height; i++)
  29. cin.read(data[i], header.width);
  30. }
  31.  
  32. void invertion(Header &header) {
  33. for (int i = 0; i < header.height; i++)
  34. for (int j = 0; j < header.width; j++)
  35. data[i][j] = abs(data[i][j] - 255);
  36. }
  37.  
  38. void goriz(Header &header) {
  39. for (int i = 0; i < header.height; i++)
  40. for (int j = 0; j < header.width / 2; j++)
  41. swap(data[i][j], data[i][header.width - j - 1]);
  42. }
  43.  
  44. void vert(Header &header) {
  45. for (int i = 0; i < header.width; i++)
  46. for (int j = 0; j < header.height / 2; j++)
  47. swap(data[j][i], data[header.height - j - 1][i]);
  48. }
  49.  
  50. void povpo(Header &header) {
  51. temp = new char*[header.width];
  52. for (int i = 0; i < header.width; i++)
  53. temp[i] = new char[header.height];
  54.  
  55. for (int i = 0; i < header.width; i++)
  56. for (int j = 0; j < header.height; j++)
  57. temp[i][j] = data[header.height - j - 1][i];
  58. }
  59.  
  60. void povpro(Header &header) {
  61. temp = new char*[header.width];
  62. for (int i = 0; i < header.width; i++)
  63. temp[i] = new char[header.height];
  64.  
  65. for (int i = 0; i < header.width; i++)
  66. for (int j = 0; j < header.height; j++)
  67. temp[i][j] = data[j][header.width - i - 1];
  68. }
  69.  
  70. void save(Header &header, char *argv[]) {
  71. ofstream cout(string(argv[2]) + ".pgm", ios::binary);
  72. if (argv[3][0] == '0' || argv[3][0] == '1' || argv[3][0] == '2') {
  73. cout << "P5" << '\n';
  74. cout << header.width << ' ' << header.height << '\n';
  75. cout << header.total << '\n';
  76. for (int i = 0; i < header.height; i++)
  77. cout.write(data[i], header.width);
  78.  
  79. for (int i = 0; i < header.height; i++)
  80. delete[] data[i];
  81. }
  82. else if (argv[3][0] == '3' || argv[3][0] == '4') {
  83. cout << "P5" << '\n';
  84. cout << header.height << ' ' << header.width << '\n';
  85. cout << header.total << '\n';
  86. for (int i = 0; i < header.width; i++)
  87. cout.write(temp[i], header.height);
  88.  
  89. for (int i = 0; i < header.width; i++)
  90. delete[] temp[i];
  91. }
  92. cout.close();
  93. }
  94. };
  95.  
  96. class P6 {
  97. private:
  98. char **data;
  99. char **temp;
  100. public:
  101.  
  102. P6(Header &header, ifstream &cin) {
  103. data = new char*[header.height];
  104. for (int i = 0; i < header.height; i++)
  105. data[i] = new char[header.width * 3];
  106.  
  107. char p;
  108. cin.read(&p, 1);
  109. for (int i = 0; i < header.height; i++)
  110. cin.read(data[i], header.width * 3);
  111. }
  112.  
  113. void invertion(Header &header) {
  114. for (int i = 0; i < header.height; i++)
  115. for (int j = 0; j < header.width * 3; j+=4)
  116. data[i][j] = abs(data[i][j] - 90);
  117. }
  118.  
  119. void goriz(Header &header) {
  120. for (int i = 0; i < header.height; i++)
  121. for (int j = 0; j < 3 * header.width / 2; j += 3) {
  122. swap(data[i][j], data[i][header.width * 3 - j - 3]);
  123. swap(data[i][j + 1], data[i][header.width * 3 - j - 2]);
  124. swap(data[i][j + 2], data[i][header.width * 3 - j - 1]);
  125. }
  126. }
  127.  
  128. void vert(Header &header) {
  129. for (int i = 0; i < 3 * header.width; i++)
  130. for (int j = 0; j < header.height / 2; j++) {
  131. swap(data[j][i], data[header.height - j - 1][i]);
  132. }
  133. }
  134.  
  135. void povpo(Header &header) {
  136. temp = new char*[header.width];
  137. for (int i = 0; i < header.width; i++)
  138. temp[i] = new char[header.height * 3];
  139.  
  140. int k = 1;
  141. for (int i = 0; i < header.width; i++)
  142. for (int j = 0; j < header.height * 3; j += 3) {
  143. if (j == 0)
  144. k = 0;
  145. temp[i][j] = data[header.height + k - 1][i * 3];
  146. temp[i][j + 1] = data[header.height + k - 1][i * 3 + 1];
  147. temp[i][j + 2] = data[header.height + k - 1][i * 3 + 2];
  148. k--;
  149. }
  150. }
  151.  
  152. void povpro(Header &header) {
  153. temp = new char*[header.width];
  154. for (int i = 0; i < header.width; i++)
  155. temp[i] = new char[header.height * 3];
  156.  
  157. int k = 1;
  158. for (int i = 0; i < header.width; i++)
  159. for (int j = 0; j < header.height * 3; j += 3) {
  160. if (j == 0)
  161. k = 0;
  162. temp[i][j] = data[k][header.width * 3 - 3 * i - 3];
  163. temp[i][j + 1] = data[k][header.width * 3 - 3 * i - 2];
  164. temp[i][j + 2] = data[k][header.width * 3 - 3 * i - 1];
  165. k++;
  166. }
  167. }
  168.  
  169. void save(Header &header, char *argv[]) {
  170. ofstream cout(string(argv[2]) + ".ppm", ios::binary);
  171. if (argv[3][0] == '0' || argv[3][0] == '1' || argv[3][0] == '2') {
  172. cout << "P6" << '\n';
  173. cout << header.width << ' ' << header.height << '\n';
  174. cout << header.total << '\n';
  175. for (int i = 0; i < header.height; i++)
  176. cout.write(data[i], header.width * 3);
  177.  
  178. for (int i = 0; i < header.height; i++)
  179. delete[] data[i];
  180. }
  181. else if (argv[3][0] == '3' || argv[3][0] == '4') {
  182. cout << "P6" << '\n';
  183. cout << header.height << ' ' << header.width << '\n';
  184. cout << header.total << '\n';
  185. for (int i = 0; i < header.width; i++)
  186. cout.write(temp[i], header.height * 3);
  187.  
  188. for (int i = 0; i < header.width; i++)
  189. delete[] temp[i];
  190. }
  191. cout.close();
  192. }
  193. };
  194.  
  195. int main(int argc, char *argv[]) {
  196. Header header;
  197. string file = argv[1];
  198. int size = file.size() - 1;
  199. ifstream cin(file, ios::binary);
  200. if (argc < 4) {
  201. cout << "Not enought arguments";
  202. return 0;
  203. }
  204. if (!cin) {
  205. cout << "File aren't found";
  206. return 0;
  207. }
  208. else if (!(file[size] == 'm'
  209. && (file[size - 1] == 'p' || file[size - 1] == 'g')
  210. && file[size - 2] == 'p' && file[size - 3] == '.')) {
  211. cout << "Invalid format";
  212. return 0;
  213. }
  214.  
  215. cin >> header.head;
  216. cin >> header.width >> header.height >> header.total;
  217.  
  218. if (header.head[1] == '5') {
  219. P5 file(header, cin);
  220.  
  221. if (argv[3][0] == '0')
  222. file.invertion(header);
  223. else if (argv[3][0] == '1') //отобрзить по горизонтали
  224. file.goriz(header);
  225. else if (argv[3][0] == '2') //отобрзить по вертикали
  226. file.vert(header);
  227. else if (argv[3][0] == '3') //поворот на 90* по
  228. file.povpo(header);
  229. else if (argv[3][0] == '4') //поворот на 90* прот
  230. file.povpro(header);
  231.  
  232. file.save(header, argv);
  233. }
  234.  
  235. else if (header.head[1] == '6') {
  236. P6 file(header, cin);
  237.  
  238. if (argv[3][0] == '0')
  239. file.invertion(header);
  240. else if (argv[3][0] == '1') //отобрзить по горизонтали
  241. file.goriz(header);
  242. else if (argv[3][0] == '2') //отобрзить по вертикали
  243. file.vert(header);
  244. else if (argv[3][0] == '3') //поворот на 90* по
  245. file.povpo(header);
  246. else if (argv[3][0] == '4') //поворот на 90* прот
  247. file.povpro(header);
  248.  
  249. file.save(header, argv);
  250. }
  251.  
  252. cin.close();
  253. return 0;
  254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement