Я не могу достичь размера заголовка файла BMP в коде c - PullRequest
0 голосов
/ 21 июня 2020

Я хочу скопировать 1-битное изображение BMP и написал этот код. Я не знаю, почему размер структуры заголовка в моем коде равен 56, хотя он должен быть 54.

Мой код для структуры HeaderBMP:



      short _type;    // file type
      short _size;
    int _reserved;
       int _offset;

        int  _info_size;
        int _width;
        int _height;

        short _planes;
        short _bpp;

        int _compression;
        int _imagesize;

        int _xresolution;
        int _yresolution;

        int _colours;
        int _impcolours;


Я не могу достучаться до до 54-го размера получается 52 или 56, когда я пытаюсь исправить. Надеюсь, вы поможете мне это исправить.

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Используйте целые числа фиксированного размера для такого рода структур. Эти типы определены в заголовочном файле stdint.h. struct может потребовать упаковки (которая определяется реализацией)

g cc пример:

typedef struct {             // Total: 54 bytes
  uint16_t  type;             // Magic identifier: 0x4d42
  uint32_t  size;             // File size in bytes
  uint16_t  reserved1;        // Not used
  uint16_t  reserved2;        // Not used
  uint32_t  offset;           // Offset to image data in bytes from beginning of file (54 bytes)
  uint32_t  dib_header_size;  // DIB Header size in bytes (40 bytes)
  int32_t   width_px;         // Width of the image
  int32_t   height_px;        // Height of image
  uint16_t  num_planes;       // Number of color planes
  uint16_t  bits_per_pixel;   // Bits per pixel
  uint32_t  compression;      // Compression type
  uint32_t  image_size_bytes; // Image size in bytes
  int32_t   x_resolution_ppm; // Pixels per meter
  int32_t   y_resolution_ppm; // Pixels per meter
  uint32_t  num_colors;       // Number of colors  
  uint32_t  important_colors; // Important colors 
} __attribute__((packed)) BMPHeader;

0 голосов
/ 23 июня 2020

Спасибо за ваше решение, однако его также 56, когда я компилирую, передавая аргумент через cmd в окне 10 x64. Это 54, когда он работает на ubuntu и codeblock в окне с передачей аргумента в коде. Мое решение:

typedef struct {             // Total: 54 bytes
   char  _type[2];             // Magic identifier: 0x4d42
  char  _size[4];             // File size in bytes
  char _reserved1[2];        // Not used
  char  _reserved2[2];        // Not used
  char _offset[4];           // Offset to image data in bytes from beginning of file (54 bytes)
  char  _dib_header_size[4];  // DIB Header size in bytes (40 bytes)
  char   _width[4];         // Width of the image
  char   _height[4];        // Height of image
  char _planes[2];       // Number of color planes
  char  _bpp[2];   // Bits per pixel
  char _compression[4];      // Compression type
  char  _image_size[4]; // Image size in bytes
  char   _x_resolution_ppm[4]; // Pixels per meter
  char   _y_resolution_ppm[4]; // Pixels per meter
  char _num_colors[4];       // Number of colors
  char  _important_colors[4]; // Important colors
}  header;

, и когда мне нужно принять значение, я сделаю:

    *(int*) header._width

Я тестирую, и он работает с тремя вышеупомянутыми случаями.

...