*以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;
}