在C内存中读取和写入BMP文件错误
问题描述:
我正在尝试编写程序以反转图像的颜色。我的问题是当我尝试从我的BMP文件中的DIB标题读取。在C内存中读取和写入BMP文件错误
当我尝试获取文件头大小并使用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;
}
而且,这里是输出到我的计划。
答
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[]);
请**启用所有警告编译**。您应该将C编译器的所有警告视为**错误**。如果您无法解决警告,那么您可以询问有关情况。 –
还要注意你的代码依赖于32位宽的'unsigned int'。 –
此外,对于[MCVE](mcve),请删除图像中的所有不必要的代码,并且如果可能,请格式化代码以使其很好地缩进。现在,一半的代码行甚至在崩溃之前并未实际使用。 –