Отображение картинки bmp - C (СИ)
Формулировка задачи:
Привет. Пытаюсь отобразить картинку по вертикали, но компилятор ругается. Подскажите, что не так? Буду благодарен
Листинг программы
- #include <stdint.h>
- #include <malloc.h>
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct BitMapFileHeader
- {
- uint16_t bfType1;
- uint16_t bfType2;
- uint32_t bfSize;
- uint32_t notUsed;
- uint32_t bfOffBits;
- uint32_t biSize;
- uint32_t biWidth;
- uint32_t biHeight;
- uint16_t biPlanes;
- uint16_t biBitCount;
- uint32_t biCompression;
- uint32_t biSizeImage;
- uint32_t biXPelsPerMeter;
- uint32_t biYPelsPerMeter;
- uint32_t biClrUsed;
- uint32_t biClrImportant;
- } BMPHeader;
- char* image;
- BMPHeader *p_header;
- void readFile(char *path)
- {
- FILE *pFile;
- int width, height, imageSize, bytes;
- p_header = (BMPHeader*)malloc(sizeof(BMPHeader));
- if(fread(&pFile, path, "rb" ) != 0)
- {
- fputs("openError",stderr);
- exit(1);
- }
- if(fread(p_header, sizeof(char), 54, pFile) != 54)
- {
- fputs("headreadError",stderr);
- exit(1);
- }
- if((*p_header).bfType1 != 'B' || (*p_header).bfType2 != 'M')
- {
- fputs("Wrong format",stderr);
- exit(1);
- }
- imageSize = (*p_header).biSizeImage;
- image = (char*)malloc(imageSize);
- fseek (pFile, 54, SEEK_SET);
- if (fread(image, 1, imageSize, pFile) != imageSize)
- {
- fputs("readImError",stderr);
- exit(1);
- }
- fclose(pFile);
- }
- void writeFile(char* path)
- {
- FILE *file;
- if(fread(file,path,"wb") != 0)
- {
- fputs("openError",stderr);
- exit(1);
- }
- fwrite(p_header, 1, 54, file);
- fwrite(image,(*p_header).biSizeImage, 1, file);
- fclose(file);
- }
- void Reverse()
- {
- int i,k,length;
- char* buf;
- length = ((*p_header).biWidth * 3 + (*p_header).biWidth%4);
- buf = (char*)malloc(length);
- for (i=0; i<(*p_header).biHeight/2;i++)
- {
- for(k=0;k<length;k++)
- {
- buf[k] = image[k+length*i];
- image[k+length*i]=image[k+length*((*p_header).biHeight-1-i)];
- image[k+length*((*p_header).biHeight-1-i)] = buf[k];
- }
- }
- }
- void main()
- {
- readFile("1.bmp");
- Reverse();
- writeFile("result.bmp");
- }
Листинг программы
- gcc -o lab6 lab6.c
- lab6.c: In function `readFile':
- lab6.c:35: warning: passing arg 2 of `fread' makes integer from pointer without a cast
- lab6.c:35: warning: passing arg 3 of `fread' makes integer from pointer without a cast
- lab6.c:35: error: too few arguments to function `fread'
- lab6.c: In function `writeFile':
- lab6.c:65: warning: passing arg 2 of `fread' makes integer from pointer without a cast
- lab6.c:65: warning: passing arg 3 of `fread' makes integer from pointer without a cast
- lab6.c:65: error: too few arguments to function `fread'
- lab6.c: In function `main':
- lab6.c:91: warning: return type of 'main' is not `int'
- lab6.c:97:2: warning: no newline at end of file
Решение задачи: «Отображение картинки bmp»
textual
Листинг программы
- #include <stdio.h>
- #include <malloc.h>
- struct
- {
- short signature;
- int size;
- int adress;
- int lengthHead;
- int lenght;
- int heigh;
- short numColPlosk;
- short bitPerPix;
- int comprMet;
- int arrLenght;
- int gorResolution;
- int vertResolution;
- int numColors;
- int numMainColors;
- } headBMP;
- char *pic;
- void readPic(char *path)
- {
- long int i;
- FILE *pFile;
- pFile=fopen(path, "rb");
- if(pFile == NULL) {printf("error open pFile"); exit(1);}
- else
- {
- fread(&headBMP.signature, sizeof(short), 1, pFile);
- if(headBMP.signature != (short)0x4d42){printf("pFile not bmp");exit(1);}
- else
- {
- fread(&headBMP.size, sizeof(int), 1, pFile);
- fseek(pFile,2*sizeof(short), SEEK_CUR);
- fread(&headBMP.adress, sizeof(int), 1, pFile);
- fread(&headBMP.lengthHead, sizeof(int), 1, pFile);
- fread(&headBMP.lenght, sizeof(int), 1, pFile);
- fread(&headBMP.heigh, sizeof(int), 1, pFile);
- fread(&headBMP.numColPlosk, sizeof(short), 1, pFile);
- fread(&headBMP.bitPerPix, sizeof(short), 1, pFile);
- if(headBMP.bitPerPix !=(short)24){printf("Bmp is not 24\n"); exit (1);}
- else
- {
- fread(&headBMP.comprMet, sizeof(int), 1, pFile);
- fread(&headBMP.arrLenght, sizeof(int), 1, pFile);
- fread(&headBMP.gorResolution, sizeof(int), 1, pFile);
- fread(&headBMP.vertResolution, sizeof(int), 1, pFile);
- fread(&headBMP.numColors, sizeof(int), 1, pFile);
- fread(&headBMP.numMainColors, sizeof(int), 1, pFile);
- }
- }
- pic=(char*)malloc(3*headBMP.heigh*headBMP.lenght*sizeof(char));
- if(pic==0){printf("Not ram\n");exit (1);}
- else
- {
- fseek(pFile,54*sizeof(char),SEEK_SET);
- for (i=0;i<3*headBMP.heigh*headBMP.lenght; i++)
- {
- if(i%(3*headBMP.lenght)==0 && i !=0)
- {
- fseek(pFile,sizeof(char)*((headBMP.arrLenght-(3*headBMP.lenght*headBMP.heigh))/headBMP.heigh), SEEK_CUR);
- }
- fread(&pic[i],sizeof(char),1,pFile);
- }
- }
- }
- fclose(pFile);
- }
- void writePic(char *path)
- {
- long int i;
- FILE *pFile;
- pFile=fopen(path, "wb");
- if(pFile==NULL)
- {
- printf("error with open");
- }
- else
- {
- fwrite(&headBMP.signature,sizeof(short),1,pFile);
- fwrite(&headBMP.size, sizeof(int),1,pFile);
- fseek(pFile,2*sizeof(short),SEEK_CUR);
- fwrite(&headBMP.adress,sizeof(int),1,pFile);
- fwrite(&headBMP.lengthHead,sizeof(int),1,pFile);
- fwrite(&headBMP.lenght,sizeof(int),1,pFile);
- fwrite(&headBMP.heigh,sizeof(int),1,pFile);
- fwrite(&headBMP.numColPlosk,sizeof(short),1,pFile);
- fwrite(&headBMP.bitPerPix,sizeof(short),1,pFile);
- fwrite(&headBMP.comprMet,sizeof(int),1,pFile);
- fwrite(&headBMP.arrLenght,sizeof(int),1,pFile);
- fwrite(&headBMP.gorResolution,sizeof(int),1,pFile);
- fwrite(&headBMP.vertResolution,sizeof(int),1,pFile);
- fwrite(&headBMP.numColors,sizeof(int),1,pFile);
- fwrite(&headBMP.numMainColors,sizeof(int),1,pFile);
- fseek(pFile, 54*sizeof(char), SEEK_SET);
- for(i=0;i<3*headBMP.heigh*headBMP.lenght;i++)
- {
- if(i%(3*headBMP.lenght)==0 && i !=0)
- {
- fseek(pFile,sizeof(char)*((headBMP.arrLenght-(3*headBMP.lenght*headBMP.heigh))/headBMP.heigh), SEEK_CUR);
- }
- fwrite(&pic[i],sizeof(char),1,pFile);
- }
- for(i=0;i<((headBMP.arrLenght-(3*headBMP.lenght*headBMP.heigh))/headBMP.heigh);i++)
- {
- fwrite(&pic[1],sizeof(char),1,pFile);
- }
- }
- fclose(pFile);
- }
- void verticalReflectC()
- {
- char buf = 0x00;
- int i,k;
- for (i=0;i<headBMP.heigh/2;i++)
- {
- for(k=0;k<headBMP.lenght*3;k++)
- {
- buf=pic[k+(headBMP.lenght*3)*i];
- pic[k+(headBMP.lenght*3)*i]=pic[(headBMP.heigh-i-1)*headBMP.lenght*3+k];
- pic[(headBMP.heigh-i-1)*headBMP.lenght*3+k]=buf;
- }
- }
- }
- int main( int argc, char** argv )
- {
- readPic("1.bmp");
- verticalReflectC();
- writePic("result.bmp");
- free(pic);
- return 0;
- }
Объяснение кода листинга программы
Структура данных headBMP содержит поля, которые описывают информацию о файле BMP. Список полей headBMP:
- signature - подпись файла BMP, должна быть равна 0x4d42.
- size - размер изображения в байтах, включая информацию о голове.
- adress - адрес начала изображения в файле.
- lengthHead - длина головы изображения в байтах.
- lenght - длина изображения в байтах.
- heigh - высота изображения в пикселях.
- numColPlosk - количество цветов в палитре изображения.
- bitPerPix - количество бит, используемых для представления одного пикселя.
- comprMet - метод сжатия изображения.
- arrLenght - длина массива цветов в палитре изображения.
- gorResolution - горизонтальное разрешение изображения в пикселях на дюйм.
- vertResolution - вертикальное разрешение изображения в пикселях на дюйм.
- numColors - общее количество цветов в изображении.
- numMainColors - количество основных цветов в палитре изображения.
Функция readPic открывает файл BMP, считывает информацию о голове изображения и сам образ. Если файл не является BMP файлом или имеет неправильную структуру, выводится сообщение об ошибке и программа завершается.
Функция writePic записывает информацию о голове изображения и сам образ в файл BMP.
Функция verticalReflectC отражает изображение по вертикали, используя буфер buf для временного хранения пикселей.
В функции main сначала вызывается функция readPic для чтения изображения, затем функция verticalReflectC для отражения изображения по вертикали, и, наконец, функция writePic для записи измененного изображения в файл
result.bmp
. После этого выделенная память освобождается и программа возвращает 0, что означает успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д