Отображение картинки bmp - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Привет. Пытаюсь отобразить картинку по вертикали, но компилятор ругается. Подскажите, что не так? Буду благодарен
Листинг программы
  1. #include <stdint.h>
  2. #include <malloc.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. typedef struct BitMapFileHeader
  6. {
  7. uint16_t bfType1;
  8. uint16_t bfType2;
  9. uint32_t bfSize;
  10. uint32_t notUsed;
  11. uint32_t bfOffBits;
  12. uint32_t biSize;
  13. uint32_t biWidth;
  14. uint32_t biHeight;
  15. uint16_t biPlanes;
  16. uint16_t biBitCount;
  17. uint32_t biCompression;
  18. uint32_t biSizeImage;
  19. uint32_t biXPelsPerMeter;
  20. uint32_t biYPelsPerMeter;
  21. uint32_t biClrUsed;
  22. uint32_t biClrImportant;
  23. } BMPHeader;
  24. char* image;
  25. BMPHeader *p_header;
  26. void readFile(char *path)
  27. {
  28. FILE *pFile;
  29. int width, height, imageSize, bytes;
  30. p_header = (BMPHeader*)malloc(sizeof(BMPHeader));
  31. if(fread(&pFile, path, "rb" ) != 0)
  32. {
  33. fputs("openError",stderr);
  34. exit(1);
  35. }
  36. if(fread(p_header, sizeof(char), 54, pFile) != 54)
  37. {
  38. fputs("headreadError",stderr);
  39. exit(1);
  40. }
  41. if((*p_header).bfType1 != 'B' || (*p_header).bfType2 != 'M')
  42. {
  43. fputs("Wrong format",stderr);
  44. exit(1);
  45. }
  46. imageSize = (*p_header).biSizeImage;
  47. image = (char*)malloc(imageSize);
  48. fseek (pFile, 54, SEEK_SET);
  49. if (fread(image, 1, imageSize, pFile) != imageSize)
  50. {
  51. fputs("readImError",stderr);
  52. exit(1);
  53. }
  54. fclose(pFile);
  55. }
  56. void writeFile(char* path)
  57. {
  58. FILE *file;
  59. if(fread(file,path,"wb") != 0)
  60. {
  61. fputs("openError",stderr);
  62. exit(1);
  63. }
  64. fwrite(p_header, 1, 54, file);
  65. fwrite(image,(*p_header).biSizeImage, 1, file);
  66. fclose(file);
  67. }
  68. void Reverse()
  69. {
  70. int i,k,length;
  71. char* buf;
  72. length = ((*p_header).biWidth * 3 + (*p_header).biWidth%4);
  73. buf = (char*)malloc(length);
  74. for (i=0; i<(*p_header).biHeight/2;i++)
  75. {
  76. for(k=0;k<length;k++)
  77. {
  78. buf[k] = image[k+length*i];
  79. image[k+length*i]=image[k+length*((*p_header).biHeight-1-i)];
  80. image[k+length*((*p_header).biHeight-1-i)] = buf[k];
  81. }
  82. }
  83. }
  84. void main()
  85. {
  86. readFile("1.bmp");
  87. Reverse();
  88. writeFile("result.bmp");
  89. }
Листинг программы
  1. gcc -o lab6 lab6.c
  2. lab6.c: In function `readFile':
  3. lab6.c:35: warning: passing arg 2 of `fread' makes integer from pointer without a cast
  4. lab6.c:35: warning: passing arg 3 of `fread' makes integer from pointer without a cast
  5. lab6.c:35: error: too few arguments to function `fread'
  6. lab6.c: In function `writeFile':
  7. lab6.c:65: warning: passing arg 2 of `fread' makes integer from pointer without a cast
  8. lab6.c:65: warning: passing arg 3 of `fread' makes integer from pointer without a cast
  9. lab6.c:65: error: too few arguments to function `fread'
  10. lab6.c: In function `main':
  11. lab6.c:91: warning: return type of 'main' is not `int'
  12. lab6.c:97:2: warning: no newline at end of file

Решение задачи: «Отображение картинки bmp»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3.  
  4.  
  5. struct
  6. {
  7.     short signature;
  8.     int size;
  9.     int adress;
  10.     int lengthHead;
  11.     int lenght;
  12.     int heigh;
  13.     short numColPlosk;
  14.     short bitPerPix;
  15.     int comprMet;
  16.     int arrLenght;
  17.     int gorResolution;
  18.     int vertResolution;
  19.     int numColors;
  20.     int numMainColors;
  21. } headBMP;
  22.  
  23. char *pic;
  24. void readPic(char *path)
  25. {
  26.     long int i;
  27.     FILE *pFile;
  28.     pFile=fopen(path, "rb");
  29.     if(pFile == NULL) {printf("error open pFile"); exit(1);}
  30.     else
  31.     {
  32.         fread(&headBMP.signature, sizeof(short), 1, pFile);
  33.         if(headBMP.signature != (short)0x4d42){printf("pFile not bmp");exit(1);}
  34.         else
  35.         {
  36.             fread(&headBMP.size, sizeof(int), 1, pFile);
  37.             fseek(pFile,2*sizeof(short), SEEK_CUR);
  38.             fread(&headBMP.adress, sizeof(int), 1, pFile);
  39.             fread(&headBMP.lengthHead, sizeof(int), 1, pFile);
  40.             fread(&headBMP.lenght, sizeof(int), 1, pFile);
  41.             fread(&headBMP.heigh, sizeof(int), 1, pFile);
  42.             fread(&headBMP.numColPlosk, sizeof(short), 1, pFile);
  43.             fread(&headBMP.bitPerPix, sizeof(short), 1, pFile);
  44.             if(headBMP.bitPerPix !=(short)24){printf("Bmp is not 24\n"); exit (1);}        
  45.             else
  46.             {
  47.                 fread(&headBMP.comprMet, sizeof(int), 1, pFile);
  48.                 fread(&headBMP.arrLenght, sizeof(int), 1, pFile);
  49.                 fread(&headBMP.gorResolution, sizeof(int), 1, pFile);
  50.                 fread(&headBMP.vertResolution, sizeof(int), 1, pFile);
  51.                 fread(&headBMP.numColors, sizeof(int), 1, pFile);
  52.                 fread(&headBMP.numMainColors, sizeof(int), 1, pFile);
  53.             }
  54.         }
  55.         pic=(char*)malloc(3*headBMP.heigh*headBMP.lenght*sizeof(char));
  56.         if(pic==0){printf("Not ram\n");exit (1);}
  57.             else
  58.             {
  59.                 fseek(pFile,54*sizeof(char),SEEK_SET);
  60.                 for (i=0;i<3*headBMP.heigh*headBMP.lenght; i++)
  61.                 {
  62.                     if(i%(3*headBMP.lenght)==0 && i !=0)
  63.                     {
  64.                         fseek(pFile,sizeof(char)*((headBMP.arrLenght-(3*headBMP.lenght*headBMP.heigh))/headBMP.heigh), SEEK_CUR);
  65.                     }
  66.                     fread(&pic[i],sizeof(char),1,pFile);
  67.                 }
  68.             }
  69.         }
  70.     fclose(pFile);
  71. }
  72. void writePic(char *path)
  73. {
  74.     long int i;
  75.     FILE *pFile;
  76.     pFile=fopen(path, "wb");
  77.     if(pFile==NULL)
  78.     {
  79.         printf("error with open");
  80.     }
  81.     else
  82.     {
  83.         fwrite(&headBMP.signature,sizeof(short),1,pFile);
  84.         fwrite(&headBMP.size, sizeof(int),1,pFile);
  85.         fseek(pFile,2*sizeof(short),SEEK_CUR);
  86.         fwrite(&headBMP.adress,sizeof(int),1,pFile);
  87.         fwrite(&headBMP.lengthHead,sizeof(int),1,pFile);
  88.         fwrite(&headBMP.lenght,sizeof(int),1,pFile);
  89.         fwrite(&headBMP.heigh,sizeof(int),1,pFile);
  90.         fwrite(&headBMP.numColPlosk,sizeof(short),1,pFile);
  91.         fwrite(&headBMP.bitPerPix,sizeof(short),1,pFile);
  92.         fwrite(&headBMP.comprMet,sizeof(int),1,pFile);
  93.         fwrite(&headBMP.arrLenght,sizeof(int),1,pFile);
  94.         fwrite(&headBMP.gorResolution,sizeof(int),1,pFile);
  95.         fwrite(&headBMP.vertResolution,sizeof(int),1,pFile);
  96.         fwrite(&headBMP.numColors,sizeof(int),1,pFile);
  97.         fwrite(&headBMP.numMainColors,sizeof(int),1,pFile);
  98.  
  99.         fseek(pFile, 54*sizeof(char), SEEK_SET);
  100.         for(i=0;i<3*headBMP.heigh*headBMP.lenght;i++)
  101.         {
  102.             if(i%(3*headBMP.lenght)==0 && i !=0)
  103.             {
  104.                 fseek(pFile,sizeof(char)*((headBMP.arrLenght-(3*headBMP.lenght*headBMP.heigh))/headBMP.heigh), SEEK_CUR);
  105.             }
  106.             fwrite(&pic[i],sizeof(char),1,pFile);
  107.         }
  108.         for(i=0;i<((headBMP.arrLenght-(3*headBMP.lenght*headBMP.heigh))/headBMP.heigh);i++)
  109.         {
  110.             fwrite(&pic[1],sizeof(char),1,pFile);
  111.         }
  112.     }
  113.     fclose(pFile);
  114. }
  115. void verticalReflectC()
  116. {
  117.     char buf = 0x00;
  118.     int i,k;
  119.     for (i=0;i<headBMP.heigh/2;i++)
  120.     {
  121.         for(k=0;k<headBMP.lenght*3;k++)
  122.         {
  123.             buf=pic[k+(headBMP.lenght*3)*i];
  124.             pic[k+(headBMP.lenght*3)*i]=pic[(headBMP.heigh-i-1)*headBMP.lenght*3+k];
  125.             pic[(headBMP.heigh-i-1)*headBMP.lenght*3+k]=buf;
  126.         }
  127.     }
  128. }
  129. int main( int argc, char** argv )
  130. {
  131.     readPic("1.bmp");
  132.     verticalReflectC();
  133.     writePic("result.bmp");
  134.     free(pic);
  135.     return 0;
  136. }

Объяснение кода листинга программы

Структура данных headBMP содержит поля, которые описывают информацию о файле BMP. Список полей headBMP:

  1. signature - подпись файла BMP, должна быть равна 0x4d42.
  2. size - размер изображения в байтах, включая информацию о голове.
  3. adress - адрес начала изображения в файле.
  4. lengthHead - длина головы изображения в байтах.
  5. lenght - длина изображения в байтах.
  6. heigh - высота изображения в пикселях.
  7. numColPlosk - количество цветов в палитре изображения.
  8. bitPerPix - количество бит, используемых для представления одного пикселя.
  9. comprMet - метод сжатия изображения.
  10. arrLenght - длина массива цветов в палитре изображения.
  11. gorResolution - горизонтальное разрешение изображения в пикселях на дюйм.
  12. vertResolution - вертикальное разрешение изображения в пикселях на дюйм.
  13. numColors - общее количество цветов в изображении.
  14. numMainColors - количество основных цветов в палитре изображения. Функция readPic открывает файл BMP, считывает информацию о голове изображения и сам образ. Если файл не является BMP файлом или имеет неправильную структуру, выводится сообщение об ошибке и программа завершается. Функция writePic записывает информацию о голове изображения и сам образ в файл BMP. Функция verticalReflectC отражает изображение по вертикали, используя буфер buf для временного хранения пикселей. В функции main сначала вызывается функция readPic для чтения изображения, затем функция verticalReflectC для отражения изображения по вертикали, и, наконец, функция writePic для записи измененного изображения в файл result.bmp. После этого выделенная память освобождается и программа возвращает 0, что означает успешное выполнение.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут