2016-10-02 2 views
-3

Я пытаюсь написать программу для инвертирования цвета изображения. Моя проблема в том, что я пытаюсь читать из заголовка DIB в моем BMP-файле.Чтение и запись BMP-файлов в C-памяти ошибка

Когда я пытаюсь получить размер заголовка файла и использовать fread (dib.fileheader, 4,1, fp); , Я получаю сообщение об ошибке «Память не может быть записана». Я приложил его для дальнейших разъяснений.

enter image description here

Вот мой код:

#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; 

    } 

Также здесь есть выход к моей программе.

enter image description here

+0

Пожалуйста компилировать с ** все предупреждения с поддержкой **. Вы должны учитывать все предупреждения из компилятора C как ** ошибки **. Если вы не можете исправить предупреждение, вы можете спросить об этом. –

+0

Также обратите внимание, что ваш код использует 'unsigned int' ширину 32 бита. –

+0

Кроме того, для [MCVE] (mcve) удалите все ненужные коды на изображении и, если возможно, отформатируйте код так, чтобы он был отступом. Теперь половина строк кода даже не используется до сбоя. –

ответ

1

fread ожидает указатель на память для записи содержимого файла. Таким образом, вы должны дать ему адрес dib.fileheader

fread(&dib.fileheader, sizeof(dib.fileheader),1,fp); 
printf("File header is %d bytes\n", dib.fileheader); 

Это жаловалась, потому что это интерпретировать то, что в dib.fileheader как адрес, запись, которая может или не может быть действительным для вашей программы.

Обратите внимание, что следующее в порядке, как он стоит, потому что bmp.filetype уже указатель на символ - это символ []

fread(bmp.filetype, 1,2,fp); 
printf("Value is %c\n", bmp.filetype[1]); 

Чтобы сделать его немного более общим, вы могли бы написать

fread(bmp.filetype, sizeof(bmp.filetype), 1, fp); 
printf("Value is %c\n", bmp.filetype[1]); 
+0

Хорошо, что сработало. Спасибо за помощь! –

0

Я попытался скомпилировать ваш код. Вы должны внести некоторые изменения в свой код.

fread(bmp.filesize, 4,1,fp); --- > fread(&bmp.filesize, 4,1,fp); 
fread(bmp.dataoffset, 4,1,fp); --- > fread(&bmp.dataoffset, 4,1,fp); 
fread(dib.fileheader, 4,1,fp); --- > fread(&dib.fileheader, 4,1,fp); 
declare the function : void invertImage(char fileName[]); 

Смежные вопросы