Я пытаюсь написать программу для инвертирования цвета изображения. Моя проблема в том, что я пытаюсь читать из заголовка DIB в моем BMP-файле.Чтение и запись BMP-файлов в C-памяти ошибка
Когда я пытаюсь получить размер заголовка файла и использовать fread (dib.fileheader, 4,1, fp); , Я получаю сообщение об ошибке «Память не может быть записана». Я приложил его для дальнейших разъяснений.
Вот мой код:
#include <stdio.h>
#include <string.h>
struct BMP {
char filetype[2]; // must be BM, must check if BM
unsigned int filesize;
short reserved1;
short reserved2;
unsigned int dataoffset;
};
struct DIB {
unsigned int fileheader;
unsigned int headersize;
int width;
int height;
short planes;
short bitsperpixel; /* we only support the value 24 here */
unsigned int compression; /* we do not support compression */
unsigned int bitmapsize;
int horizontalres;
int verticalres;
unsigned int numcolors;
unsigned int importantcolors
};
struct pixel {
int val;
char * def;
struct listitem * next;
};
void invertImage(char fileName[]){
struct BMP bmp;
struct DIB dib;
FILE *fp = fopen(fileName, "rb");
//FileType
fread(bmp.filetype, 1,2,fp);
printf("Value is %c\n", bmp.filetype[1]);
//Check if file format is BM
if(bmp.filetype[0] != 'B' && bmp.filetype[1] !='M'){
printf("Wrong format");
}
//Size of the file in bytes
fread(bmp.filesize, 4,1,fp);
printf("Value is %d\n", bmp.filesize);
//Go to dataoffset
fseek(fp,10,SEEK_CUR);
fread(bmp.dataoffset, 4,1,fp);
printf("Offset is %d\n", bmp.dataoffset);
fread(dib.fileheader, 4,1,fp);
printf("File header is %d bytes\n", dib.fileheader);
fclose(fp);
}
int main(int argc, char *argv[]){
printf("Program name %s\n", argv[0]);
if(strcmp(argv[1],"-invert") == 0) {
printf("Invert\n");
printf("File name is %s\n", argv[2]);
invertImage(argv[2]);
}
else {
printf("Greyscale\n");
//greyScaleImage();
}
return 0;
}
Также здесь есть выход к моей программе.
Пожалуйста компилировать с ** все предупреждения с поддержкой **. Вы должны учитывать все предупреждения из компилятора C как ** ошибки **. Если вы не можете исправить предупреждение, вы можете спросить об этом. –
Также обратите внимание, что ваш код использует 'unsigned int' ширину 32 бита. –
Кроме того, для [MCVE] (mcve) удалите все ненужные коды на изображении и, если возможно, отформатируйте код так, чтобы он был отступом. Теперь половина строк кода даже не используется до сбоя. –