windows读取bmp格式图像代码移植linux;windows代码移植linux,数据类型不匹配我问题;

本文详细介绍了BMP图像文件的结构体定义,在Windows和Linux平台下的具体实现方式,并对比了不同平台上数据类型的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下面的代码是bmp在windows下的结构体定义:


typedef   struct   tagBITMAPFILEHEADER{  
        unsigned   short   bfType;       //2  此处需留意
        unsigned   long    bfSize;         //4                              /*   File   size   in   bytes                     */  
        unsigned   short   bfReserved1;   //2
        unsigned   short   bfReserved2;   //2 
        unsigned   long    bfOffBits;      //4                                  /*   Offset   to   image   data,   bytes   */  
  } __attribute__((packed))BITMAPFILEHEADER,   *PBITMAPFILEHEADER;  //Attention:"__"是两个"_"!  字边界对齐!4字节对齐   知道在linux的gcc下默认的是四字节的
   
typedef   struct   tagBITMAPINFOHEADER{  
        unsigned   long    biSize;              //4                 /*   Header   size   in   bytes            */  
         long         biWidth;               //4              /*   Width   of   image                         */  
         long         biHeight;                  //4          /*   Height   of   image                       */  
        unsigned short   biPlanes;        //2        /*   Number   of   colour   planes       */  
        unsigned short   biBitCount;       //2     /*   Bits   per   pixel                         */  
        unsigned   long biCompression;       //4           /*   Compression   type                     */  
        unsigned   long biSizeImage;    //4                  /*   Image   size   in   bytes               */  
        long   biXPelsPerMeter;     //4
        long   biYPelsPerMeter;      //4  /*   Pixels   per   meter                     */  
        unsigned   long biClrUsed;       //4                   /*   Number   of   colours                   */  
        unsigned   long biClrImportant;       //4         /*   Important   colours                   */  
  } __attribute__((packed))BITMAPINFOHEADER,*PBITMAPINFOHEADER;  
   
typedef   struct   tagRGBQUAD   {  
 unsigned   char   rgbBlue;   /*   Blue   value     */  
 unsigned   char   rgbGreen;   /*   Green   value   */  
 unsigned   char   rgbRed;   /*   Red   value       */  
 unsigned   char   rgbReserved;   /*   Reserved         */  
  }   RGBQUAD;   


    

下面是在linux下的:

要包含#include<stdint.h>头文件

#pragma pack(8)
typedef   struct   tagBITMAPFILEHEADER{
        uint16_t   bfType;       //2  此处需留意
        uint32_t    bfSize;         //4                              /*   File   size   in   bytes                     */
        uint16_t   bfReserved1;   //2
        uint16_t   bfReserved2;   //2
        uint32_t    bfOffBits;      //4                                  /*   Offset   to   image   data,   bytes   */
  } __attribute__((packed))BITMAPFILEHEADER,   *PBITMAPFILEHEADER;  //Attention:"__"是两个"_"!  字边界对齐!4字节对齐   知道在linux的gcc下默认的是四字节的
#pragma pack()
#pragma pack(8)
typedef   struct   tagBITMAPINFOHEADER{
	      uint32_t    biSize;              //4                 /*   Header   size   in   bytes            */
	      int32_t         biWidth;               //4              /*   Width   of   image                         */
	      int32_t         biHeight;                  //4          /*   Height   of   image                       */
         uint16_t   biPlanes;        //2        /*   Number   of   colour   planes       */
        uint16_t   biBitCount;       //2     /*   Bits   per   pixel                         */
        uint32_t biCompression;       //4           /*   Compression   type                     */
        uint32_t biSizeImage;    //4                  /*   Image   size   in   bytes               */
        int32_t   biXPelsPerMeter;     //4
        int32_t   biYPelsPerMeter;      //4  /*   Pixels   per   meter                     */
        uint32_t biClrUsed;       //4                   /*   Number   of   colours                   */
        uint32_t biClrImportant;       //4         /*   Important   colours                   */
  } __attribute__((packed))BITMAPINFOHEADER,*PBITMAPINFOHEADER;
#pragma pack()
#pragma pack(4)
typedef   struct   tagRGBQUAD   {
 unsigned   char   rgbBlue;   /*   Blue   value     */
 unsigned   char   rgbGreen;   /*   Green   value   */
 unsigned   char   rgbRed;   /*   Red   value       */
 unsigned   char   rgbReserved;   /*   Reserved         */
  }   RGBQUAD;
#pragma pack()

个人总结

1字节     uint8_t     
2字节     uint16_t     =unsigned   short
4字节     uint32_t      =unsigned   long
8字节     uint64_t 
int32_t =long


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值