在C内存中读取和写入BMP文件错误

问题描述:

我正在尝试编写程序以反转图像的颜色。我的问题是当我尝试从我的BMP文件中的DIB标题读取。在C内存中读取和写入BMP文件错误

当我尝试获取文件头大小并使用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

还要注意你的代码依赖于32位宽的'unsigned int'。 –

+0

此外,对于[MCVE](mcve),请删除图像中的所有不必要的代码,并且如果可能,请格式化代码以使其很好地缩进。现在,一半的代码行甚至在崩溃之前并未实际使用。 –

fread需要一个指向存储器写入文件的内容。所以,你需要给它的dib.fileheader

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

它的抱怨,因为它解释无论是在dib.fileheader作为写地址,这可能是也可能不是有效的程序地址。

注意,以下是好的,因为它代表因为bmp.filetype已经是一个字符指针 - 这是一个char []

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

好的,工作。感谢您的帮助! –

我试着编译你的代码。您必须对代码进行一些更改。

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[]);