linux 保存bmp 图片

//#pragma pack(1)
typedef unsigned char  BYTE;
typedef unsigned short	WORD;
typedef unsigned int  DWORD; // 会出现bmp 头 信息不对 将long 改为int        
                             //  结构体添加 __attribute__((packed))

typedef struct tagBITMAPFILEHEADER{
     WORD     bfType;        //Linux此值为固定值,0x4d42      
     DWORD    bfSize;        //BMP文件的大小,包含三部分        
     WORD    bfReserved;    //置0      
     WORD    bfReserved2; //保留,0
     DWORD    bfOffBits;     //文件起始位置到图像像素数据的字节偏移量        
 
}__attribute__((packed)) BITMAPFILEHEADER;
 //__attribute__((packed))
 
typedef struct tagBITMAPINFOHEADER{
     DWORD    biSize;          //文件信息头的大小,40     
     DWORD    biWidth;         //图像宽度  
     DWORD    biHeight;        //图像高度   
     WORD     biPlanes;        //BMP存储RGB数据,总为1   
     WORD     biBitCount;      //图像像素位数,笔者RGB位数使用24     
     DWORD    biCompression;   //压缩 0:不压缩  1:RLE8 2:RLE4    
     DWORD    biSizeImage;     //4字节对齐的图像数据大小  
     DWORD    biXPelsPerMeter; //水平分辨率  像素/米
     DWORD    biYPelsPerMeter;  //垂直分辨率  像素/米
     DWORD    biClrUsed;        //实际使用的调色板索引数,0:使用所有的调色板索引      
     DWORD    biClrImportant;        
}__attribute__((packed)) BITMAPINFOHEADER;


typedef struct tagRGBQUAD { 
BYTE    rgbBlue; 
BYTE    rgbGreen; 
BYTE    rgbRed; 
BYTE    rgbReserved; 
} RGBQUAD;

static void SaveImage(int width, int height, const void* buffer, const char* path)
{

//Set BITMAPINFOHEADER
BITMAPINFOHEADER bi;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = width;
bi.biHeight = -height;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = 0;
bi.biSizeImage = ((width*height) <<2);
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
 
 
//Set BITMAPFILEHEADER
BITMAPFILEHEADER bf;
bf.bfType = 0x4d42;
bf.bfSize = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER) + bi.biSizeImage;
bf.bfReserved = 0;
bf.bfReserved2 = 0;
bf.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);

FILE* fp;
if((fp = fopen(path, "wb")) == NULL)
  return;

fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fp);                      //写入文件头
fwrite(&bi,sizeof(BITMAPINFOHEADER),1,fp);                      //写入信息头
fwrite(buffer,bi.biSizeImage,1,fp); //写入图像数据
fclose(fp);
}


int main()
{
    int count = 0;
    char num[100];
    snprintf(num, 100, "/home/leizhang/Documents/picture/%d.bmp", count);
    SaveImage(width, height, buffer, num);
}

linux 可能会出现bmp文件头信息不对需要将

typedef unsigned int  DWORD; // 会出现bmp 头 信息不对 将long 改为int        
结构体添加 __attribute__((packed))

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值