Advertisement
Guest User

Untitled

a guest
May 27th, 2015
276
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.16 KB | None | 0 0
  1. /*
  2. SUAI lab 13 var 5
  3. task:Написать программу, формирующую по исходному BMP файлу новый BMP файл, содержащий фрагмент
  4. исходного с заданными размерами и начальными координатами.Размеры и координаты фрагмента ввести.
  5. */
  6. #include <iostream>
  7. #include <Windows.h>
  8. #include <locale>
  9.  
  10. using namespace std;
  11.  
  12. struct RGB
  13. {
  14.  
  15. BYTE Bcolor;
  16. BYTE Gcolor;
  17. BYTE Rcolor;
  18.  
  19. }image[512 * 512], oimage[512 * 512], sepimage[512 * 512];
  20.  
  21. void main()
  22. {
  23. // вещи необходимые для изображения
  24.  
  25. int imgHeight;
  26. int imgWidth;
  27. BITMAPFILEHEADER bmfh;
  28. BITMAPINFOHEADER bmih;
  29. RGBTRIPLE RGBColor;
  30. int x1, x2, y1, y2; //точки
  31. int s = 0, o = 0, p = 0;;
  32. // файлы
  33.  
  34. FILE *inimage;
  35. FILE *outimage;
  36. FILE *sepimager;
  37.  
  38. setlocale(0, "RUSSIAN");
  39. // открытие и считывание header'a нашего входного изображения
  40.  
  41. inimage = fopen("lena.bmp", "r+b");
  42. fseek(inimage, 0, SEEK_SET);
  43. fread(&bmfh, sizeof(bmfh), 1, inimage);
  44. fread(&bmih, sizeof(bmih), 1, inimage);
  45.  
  46. imgWidth = bmih.biWidth;
  47. imgHeight = bmih.biHeight;
  48.  
  49. // массивы цветов для входяшего изображения
  50.  
  51. int **inBcolor = new int*[512];
  52. for (int i = 0; i < 512; i++)
  53. inBcolor[i] = new int[512];
  54. int **inRcolor = new int*[512];
  55. for (int i = 0; i < 512; i++)
  56. inRcolor[i] = new int[512];
  57. int **inGcolor = new int*[512];
  58. for (int i = 0; i < 512; i++)
  59. inGcolor[i] = new int[512];
  60.  
  61. int **sepBcolor = new int*[512];
  62. for (int i = 0; i < 512; i++)
  63. sepBcolor[i] = new int[512];
  64. int **sepRcolor = new int*[512];
  65. for (int i = 0; i < 512; i++)
  66. sepRcolor[i] = new int[512];
  67. int **sepGcolor = new int*[512];
  68. for (int i = 0; i < 512; i++)
  69. sepGcolor[i] = new int[512];
  70. // построения массивов цветов нашего изображения
  71.  
  72. for (int i = 0; i < 512 * 512; i++)
  73. {
  74. fread(&RGBColor, sizeof(RGBColor), 1, inimage);
  75. image[i].Rcolor = RGBColor.rgbtRed;
  76. image[i].Bcolor = RGBColor.rgbtBlue;
  77. image[i].Gcolor = RGBColor.rgbtGreen;
  78. sepimage[i].Rcolor = RGBColor.rgbtRed;
  79. sepimage[i].Bcolor = RGBColor.rgbtBlue;
  80. sepimage[i].Gcolor = RGBColor.rgbtGreen;
  81. }
  82.  
  83. s = 0;
  84. for (int i = 0; i < 512; i++)
  85. {
  86. for (int j = 0; j < 512; j++)
  87. {
  88. inBcolor[i][j] = image[s].Bcolor;
  89. inRcolor[i][j] = image[s].Rcolor;
  90. inGcolor[i][j] = image[s].Gcolor;
  91. sepBcolor[i][j] = sepimage[s].Bcolor;
  92. sepRcolor[i][j] = sepimage[s].Rcolor;
  93. sepGcolor[i][j] = sepimage[s].Gcolor;
  94. s++;
  95. }
  96. }
  97.  
  98. s = 0;
  99.  
  100. cout << 512 * 512 << " " << s;
  101.  
  102. cout << "Введите координаты:" << endl;
  103. cout << "Введите координату х1: "; cin >> x1;
  104. cout << "Введите координату x2: "; cin >> x2;
  105. if (x1 >= x2 || x1 >= 512 || x2>512)
  106. {
  107. cout << "Недопустимое значение переменных x" << endl;
  108. exit(0);
  109. }
  110. cout << "Введите координату y1: "; cin >> y1;
  111. cout << "Введите координату y2: "; cin >> y2;
  112. if (y1 >= y2 || y1 >= 512 || y2>512)
  113. {
  114. cout << "Недопустимое значение переменных y" << endl;
  115. exit(0);
  116. }
  117. cout << "Размер данного изображения : " << x2 - x1 << "x" << y2 - y1 << endl;
  118. int size = (x2 - x1)*(y2 - y1);
  119. // массив для нового изображения составляется по заданной ширине и длине
  120.  
  121. int **outBcolor = new int*[x2 - x1];
  122. for (int i = 0; i < x2 - x1; i++)
  123. outBcolor[i] = new int[y2 - y1];
  124. int **outRcolor = new int*[x2 - x1];
  125. for (int i = 0; i < x2 - x1; i++)
  126. outRcolor[i] = new int[y2 - y1];
  127. int **outGcolor = new int*[x2 - x1];
  128. for (int i = 0; i < x2 - x1; i++)
  129. outGcolor[i] = new int[y2 - y1];
  130. // CПЕПИЯ
  131. ///////////////////////////////////////////////////
  132.  
  133. p = 0; o = 0;
  134. for (int i = y1; i < y2; i++)
  135. {
  136. for (int j = x1; j < x2; j++)
  137. {
  138. sepRcolor[i][j] = round((inRcolor[i][j] * .393) + (inGcolor[i][j] * .669));
  139. sepGcolor[i][j] = round((inRcolor[i][j] * .349) + (inGcolor[i][j] * .686));
  140. sepBcolor[i][j] = round((inRcolor[i][j] * .272) + (inGcolor[i][j] * .534));
  141. }
  142. }
  143.  
  144.  
  145.  
  146. p = 0; o = 0;
  147. for (int j = 0; j < 512*512; j++)
  148. {
  149. sepimage[j].Rcolor = sepRcolor[o][p];
  150. sepimage[j].Bcolor = sepBcolor[o][p];
  151. sepimage[j].Gcolor = sepGcolor[o][p];
  152. p++;
  153. if (p == 512)
  154. {
  155. p = 0; o++;
  156. }
  157. }
  158. //ВЫРЕЗАНИЕ
  159. /////////////////////////////////////////////////
  160. p = 0; o = 0;
  161. for (int i = y1; i < y2; i++)
  162. {
  163. for (int j = x1; j < x2; j++)
  164. {
  165. outBcolor[o][p] = inBcolor[i][j];
  166. outRcolor[o][p] = inRcolor[i][j];
  167. outGcolor[o][p] = inGcolor[i][j];
  168. p++;
  169. if (p == y2 - y1)
  170. {
  171. p = 0; o++;
  172. }
  173. }
  174. }
  175.  
  176. o = 0; p = 0;
  177. for (int i = 0; i < 512 * 512; i++)
  178. {
  179. oimage[i].Rcolor = 0;
  180. oimage[i].Bcolor = 0;
  181. oimage[i].Gcolor = 0;
  182. }
  183.  
  184. p = 0; o = 0;
  185. for (int i = 0; i < size; i++)
  186. {
  187. oimage[i].Rcolor = 255 - outRcolor[o][p];
  188. oimage[i].Bcolor = 255 - outBcolor[o][p];
  189. oimage[i].Gcolor = 255 - outGcolor[o][p];
  190. p++;
  191. if (p == y2 - y1)
  192. {
  193. p = 0; o++;
  194. }
  195. }
  196.  
  197. // вывод изображения
  198. bmih.biWidth = imgWidth;
  199. bmih.biHeight = imgHeight;
  200. sepimager = fopen("sepimg.bmp", "w+b");
  201. fwrite(&bmfh, sizeof(bmfh), 1, sepimager);
  202. fwrite(&bmih, sizeof(bmih), 1, sepimager);
  203.  
  204. for (int i = 0; i < 512 * 512; i++)
  205. {
  206. fwrite(&sepimage[i], sizeof(RGB), 1, sepimager);
  207. }
  208. fclose(sepimager);
  209. bmih.biWidth = x2 - x1;
  210. bmih.biHeight = y2 - y1;
  211. outimage = fopen("output.bmp", "w+b");
  212. fwrite(&bmfh, sizeof(bmfh), 1, outimage);
  213. fwrite(&bmih, sizeof(bmih), 1, outimage);
  214.  
  215. for (int i = 0; i < 512 * 512; i++)
  216. {
  217. fwrite(&oimage[i], sizeof(RGB), 1, outimage);
  218. }
  219.  
  220. // удаление массивов нового изображения
  221. for (int i = 0; i < x2 - x1; i++)
  222. {
  223. delete[] outRcolor[i];
  224. delete[] outBcolor[i];
  225. delete[] outGcolor[i];
  226. delete[] inRcolor[i];
  227. delete[] inBcolor[i];
  228. delete[] inGcolor[i];
  229. }
  230. fcloseall();
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement