Advertisement
Guest User

Dla krychy

a guest
Jun 21st, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.21 KB | None | 0 0
  1. /* Zamiana plików bmp do skali szarosci */
  2. /* www.algorytm.org */
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. /* File Header */
  7. typedef struct BMPFILEHEADER {
  8. short type;
  9. int fileSize;
  10. short reserved0;
  11. short reserved1;
  12. int dataOffset;
  13. } BMPFILEHEADER;
  14.  
  15. /* Info Header */
  16. typedef struct BMPINFOHEADER {
  17. int hdrSize;
  18. int width;
  19. int height;
  20. short planes;
  21. short depth;
  22. int compression;
  23. int bmpDataSize;
  24. int hResolution;
  25. int vResolution;
  26. int nColors;
  27. int nImportantColors;
  28. } BMPINFOHEADER;
  29.  
  30. typedef struct RGB {
  31. unsigned char R;
  32. unsigned char G;
  33. unsigned char B;
  34. } Pixel24;
  35.  
  36. int main(int argc, char *argv[], char *envp[])
  37. {
  38. FILE *plik, *plik2;
  39. BMPFILEHEADER FileInfo;
  40. BMPINFOHEADER PictureInfo;
  41. int i, j;
  42. char szary;
  43. short padding;
  44. //char** grayPicture;
  45. Pixel24** pixmap;
  46.  
  47. if (plik = fopen("lena2.bmp", "rb"))
  48. {
  49. //wczytanie nagłówków BMP
  50. fread(&FileInfo.type, 2, 1, plik);
  51. fread(&FileInfo.fileSize, 4, 1, plik);
  52. fread(&FileInfo.reserved0, 2, 1, plik);
  53. fread(&FileInfo.reserved1, 2, 1, plik);
  54. fread(&FileInfo.dataOffset, 4, 1, plik);
  55. fread(&PictureInfo.hdrSize, 4, 1, plik);
  56. fread(&PictureInfo.width, 4, 1, plik);
  57. fread(&PictureInfo.height, 4, 1, plik);
  58. fread(&PictureInfo.planes, 2, 1, plik);
  59. fread(&PictureInfo.depth, 2, 1, plik);
  60. fread(&PictureInfo.compression, 4, 1, plik);
  61. fread(&PictureInfo.bmpDataSize, 4, 1, plik);
  62. fread(&PictureInfo.hResolution, 4, 1, plik);
  63. fread(&PictureInfo.vResolution, 4, 1, plik);
  64. fread(&PictureInfo.nColors, 4, 1, plik);
  65. fread(&PictureInfo.nImportantColors, 4, 1, plik);
  66. //alokacja pamięci pod pixmape
  67. pixmap = (Pixel24**)malloc(sizeof(Pixel24**) * PictureInfo.height);
  68. for (i = 0; i < PictureInfo.height; i++)
  69. pixmap[i] = (Pixel24*)malloc(sizeof(Pixel24) * PictureInfo.width);
  70. //obliczenie wyrównania wiersza do wielokrotności 4B
  71. padding = (PictureInfo.width * 3) % 4 ?
  72. 4 - (PictureInfo.width * 3) % 4
  73. :
  74. 0;
  75. //wczytanie bitmapy do pix mapy :P
  76. fseek(plik, FileInfo.dataOffset, SEEK_SET);
  77. for (i = 0; i < PictureInfo.height; i++, fseek(plik, padding, SEEK_CUR))
  78. for (j = 0; j < PictureInfo.width; j++)
  79. {
  80. pixmap[i][j].B = fgetc(plik);
  81. pixmap[i][j].G = fgetc(plik);
  82. pixmap[i][j].R = fgetc(plik);
  83. }
  84. //operacje na nowym pliku
  85. if (plik2 = fopen("nowy3.bmp", "wb"))
  86. { //kopiowanie pliku
  87. fseek(plik, 0, SEEK_END);
  88. j = ftell(plik);
  89. fseek(plik, 0, SEEK_SET);
  90. for (i = 0; i < j; i++)
  91. fputc(fgetc(plik), plik2);
  92. //zapis bitmapy + konwersja do szarości
  93. fseek(plik2, FileInfo.dataOffset, SEEK_SET);
  94. for (i = 0; i < PictureInfo.height; i++, fseek(plik2, padding, SEEK_CUR))
  95. for (j = 0; j < PictureInfo.width; j++)
  96. {
  97. szary = (char)(0.229*pixmap[i][j].R + 0.587*pixmap[i][j].G + 0.114*pixmap[i][j].B);
  98. fputc(szary, plik2);
  99. fputc(szary, plik2);
  100. fputc(szary, plik2);
  101. }
  102. fclose(plik2);
  103. }
  104. else printf("niepowodzenie tworzenia pliku");
  105. //zwolnienie pamięci pixmapy
  106. for (i = 0; i<PictureInfo.height; i++)
  107. free(pixmap[i]);
  108. free(pixmap);
  109. //zamkniecie plików
  110. fclose(plik);
  111. }
  112. else printf("blad odczytu pliku");
  113. system("pause");
  114. return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement