C内存中读写BMP文件报错

Reading and writing BMP files in C memory error

我正在尝试编写一个程序来反转图像的颜色。我的问题是当我尝试从我的 BMP 文件中的 DIB header 读取时。

当我尝试获取文件 header 大小并使用 fread(dib.fileheader, 4,1,fp); .我收到一个错误 "The memory could not be written"。我已附上它以作进一步说明。

这是我的代码:

#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 的指针 - 它是一个 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]);

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

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