Отображение картинки 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, что означает успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д