EzicMan

proga

Jan 7th, 2021 (edited)
736
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //    unsigned int Ptr ;                  // смещение к области данных    //10
  2. //    unsigned int Width ;          // ширина изображения в пикселах      //18
  3. //    unsigned int Height ;         // высота изображения в пикселах      //22
  4. #define _CRT_SECURE_NO_WARNINGS
  5.  
  6.  
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10.  
  11. int main(int argc, char** argv) {
  12.     unsigned int w, h, smesh;
  13.     unsigned char* massiv;
  14.     unsigned int otstup;
  15.     unsigned int size;
  16.     unsigned int i;
  17.     unsigned int j;
  18.     unsigned int estnetu;
  19.     FILE* io;
  20.     //проверяем что название файла передали в аргументах
  21.     if (argc < 2) {
  22.         printf("Ne dostatochno argumentov");
  23.         return -1;
  24.     }
  25.  
  26.     //открываем файл проверяя что он вообще существует rb = read binary
  27.     if ((io = fopen(argv[1], "r+b")) == NULL) {
  28.         printf("Net takogo faila");
  29.         return -2;
  30.     }
  31.    
  32.     //достаю из файла размеры картинки они находятся на смещениях 18 и 22
  33.     w = 0;
  34.     h = 0;
  35.     fseek(io, 18, 0);
  36.     if (fread(&w, 4, 1, io) != 1) {
  37.         printf("Oshibka pri chtenii");
  38.         return -3;
  39.     }
  40.     fseek(io, 22, 0);
  41.     if (fread(&h, 4, 1, io) != 1) {
  42.         printf("Oshibka pri chtenii");
  43.         return -3;
  44.     }
  45.     fseek(io, 10, 0);
  46.     if (fread(&smesh, 4, 1, io) != 1) {
  47.         printf("Oshibka pri chtenii");
  48.         return -3;
  49.     }
  50.  
  51.     fseek(io, smesh, 0);
  52.     //по идее в bmp длина каждой строки должна делится на 4 но так как у нас один пиксель занимает 3 байта то надо высчитать сколько в конце надо добавить нулей
  53.     otstup = (4 - (3 * w) % 4) % 4;
  54.     size = w * h * 3 + h * otstup;
  55.     if ((massiv = (unsigned char*)malloc(size * sizeof(unsigned char))) == NULL) {
  56.         printf("Oshibka pri vydelenii pamyati");
  57.         return -4;
  58.     }
  59.     if (fread(massiv, sizeof(unsigned char), size, io) != size) {
  60.         printf("Oshibka pri chtenii");
  61.         return -3;
  62.     }
  63.  
  64.     fseek(io, smesh, 0);
  65.     i = 0;
  66.     j = 0;
  67.     for (i = 0; i < h; i++) {
  68.         for (j = 0; j < w; j++) {
  69.             estnetu = 0;
  70.             //massiv[i*w*3 + j*3 + otstup*i]
  71.             if (massiv[i * w * 3 + j * 3 + otstup * i] != 0
  72.                 || massiv[i * w * 3 + j * 3 + otstup * i + 1] != 0
  73.                 || massiv[i * w * 3 + j * 3 + otstup * i + 2] != 255) {
  74.                 continue;
  75.             }
  76.             if (j != w - 1) {
  77.                 if (massiv[i * w * 3 + (j+1) * 3 + otstup * i] == 255
  78.                     && massiv[i * w * 3 + (j+1) * 3 + otstup * i + 1] == 0
  79.                     && massiv[i * w * 3 + (j+1) * 3 + otstup * i + 2] == 0) {
  80.                     estnetu++;
  81.                 }
  82.             }
  83.             if (j != 0) {
  84.                 if (massiv[i * w * 3 + (j-1) * 3 + otstup * i] == 255
  85.                     && massiv[i * w * 3 + (j-1) * 3 + otstup * i + 1] == 0
  86.                     && massiv[i * w * 3 + (j-1) * 3 + otstup * i + 2] == 0) {
  87.                     estnetu++;
  88.                 }
  89.             }
  90.             if (i != h - 1) {
  91.                 if (massiv[(i+1) * w * 3 + j * 3 + otstup * (i+1)] == 255
  92.                     && massiv[(i+1) * w * 3 + j * 3 + otstup * (i+1) + 1] == 0
  93.                     && massiv[(i+1) * w * 3 + j * 3 + otstup * (i+1) + 2] == 0) {
  94.                     estnetu++;
  95.                 }
  96.             }
  97.             if (i != 0) {
  98.                 if (massiv[(i - 1) * w * 3 + j * 3 + otstup * (i - 1)] == 255
  99.                     && massiv[(i - 1) * w * 3 + j * 3 + otstup * (i - 1) + 1] == 0
  100.                     && massiv[(i - 1) * w * 3 + j * 3 + otstup * (i - 1) + 2] == 0) {
  101.                     estnetu++;
  102.                 }
  103.             }
  104.             if (estnetu > 0) {
  105.                 massiv[i * w * 3 + j * 3 + otstup * i] = 0;
  106.                 massiv[i * w * 3 + j * 3 + otstup * i + 1] = 255;
  107.                 massiv[i * w * 3 + j * 3 + otstup * i + 2] = 0;
  108.             }
  109.         }
  110.     }
  111.  
  112.     fwrite(massiv, sizeof(unsigned char), size, io);
  113.     fclose(io);
  114.     free(massiv);
  115.     return 0;
  116. }
RAW Paste Data