读写BMP图

6 篇文章 0 订阅
3 篇文章 0 订阅

*以BMP 24为例

#include"windows.h"
typedef struct ImageStruct {
  uint8_t *data;
  uint32_t width, height;
  ImageStruct() { 
    data = NULL;
    width = height = 0;
  }
  ~ImageStruct() {
    if (data != NULL) {
      delete[] data;
    }
  }
} ImageS;

Load:

bool LoadBmp(char* inPath , ImageS *bmp) {
  FILE *fp = fopen(inPath, "rb");
  if( fp == NULL ) { return false; }

  fseek(fp, sizeof( BITMAPFILEHEADER ), 0);

  BITMAPINFOHEADER head;
  fread(&head, sizeof( BITMAPINFOHEADER ), 1, fp);
  bmp->width  = head.biWidth;
  bmp->height = head.biHeight;

  int bmpBit = head.biBitCount;
  int lineByte = (bmp->width * bmpBit / 8 + 3) / 4 * 4;
  
  bmp->datas = new uint8_t[lineByte * bmp->height];
  
  fread(bmp->data, 1, lineByte * bmp->height, fp);

  fclose( fp );
  return true;
}

Store:

bool StoreBmp(char *outPath, ImageS *bmp) {
  const int bmpBit = 24;  //TODO(Chuang): add support for the other size of bmp.
  
  int lineByte = ( bmp->width * bmpBit / 8 + 3 ) / 4 * 4;
  FILE *fp = fopen(outPath , "wb" );
  if( fp == NULL ) { return false; }

  BITMAPFILEHEADER fileHead;
  fileHead.bfType = 0x4D42;                           
  fileHead.bfSize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + 
    lineByte * bmp->height;
  fileHead.bfReserved1 = 0;
  fileHead.bfReserved2 = 0;
  fileHead.bfOffBits = 54;

  fwrite( &fileHead , sizeof( BITMAPFILEHEADER ) , 1 , fp );           

  BITMAPINFOHEADER head;
  head.biBitCount = bmpBit;
  head.biClrImportant = 0;
  head.biClrUsed = 0; 
  head.biCompression = 0;
  head.biHeight = bmp->height; 
  head.biWidth = bmp->width; 
  head.biPlanes = 1; 
  head.biSize = 40;
  head.biSizeImage = lineByte * bmp->height;
  head.biXPelsPerMeter = 0; 
  head.biYPelsPerMeter = 0;

  fwrite(&head, sizeof(BITMAPINFOHEADER), 1, fp);
  fwrite(bmp->data, bmp->height * lineByte, 1, fp);

  fclose( fp );
  
  return true;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值