Отображение картинки 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, что означает успешное выполнение.