Bitmap的文件格式:
#define UINT16 unsigned short
#define DWORD unsigned int
#define WORD short
#define LONG int // Bitmap File Header ( 14 Bytes )
typedef struct tagBITMAPFILEHEADER
{
UINT16 bfType; // same as BM in ASCII.
DWORD bfSize; // the size of the BMP file in bytes
UINT16 bfReserved1;
UINT16 bfReserved2;
DWORD bfOffBits; // starting address, of the byte where the bitmap image data (Pixel Array) can be found.
} BITMAPFILEHEADER, *PBITMAPFILEHEADER; // DIB头描述bitmap的信息,包括大小、压缩类型、颜色格式等,DIB头的大小根据版本不同,大小也不同。
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; // 4, the size of this header (40 bytes)
LONG biWidth; // 4, the bitmap width in pixels (signed integer).
LONG biHeight; // 4, the bitmap height in pixels (signed integer).
WORD biPlanes; // 2, the number of color planes being used. Must be set to 1.
WORD biBitCount; // 2, the number of bits per pixel, which is the color depth of the image. Typical values are 1, 4, 8, 16, 24 and 32.
DWORD biCompression; // 4, the compression method being used.
DWORD biSizeImage; // 4, the image size. This is the size of the raw bitmap data, and should not be confused with the file size.
LONG biXPelsPerMeter; // 4, the horizontal resolution of the image.
LONG biYPelsPerMeter; // 4, the vertical resolution of the image.
DWORD biClrUsed; // 4, the number of colors in the color palette, or 0 to default to 2^n.
DWORD biClrImportant; // 4, the number of important colors used, or 0 when every color is important; generally ignored.
} BITMAPINFOHEADER;
生成一个BMP文件:
int bitmap_file_generate( char *name, int width, int height )
{
FILE *fp = NULL;
unsigned char *pData;
unsigned char *pp;
int i, j;
int iFileSize; unsigned char bfType1, bfType2;
unsigned int bfSize;
unsigned short bfReserved1, bfReserved2;
unsigned int bfOffBits;
unsigned int biSize;
int biWidth, biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
unsigned int biXPelsPerMeter;
unsigned int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant; // offset[0:1]
bfType1 = 'B';
bfType2 = 'M';
// offset[2:5]
bfSize = width * height * + ;
// offset[6:7]
bfReserved1 = ;
// offsset[8:9]
bfReserved2 = ;
// offset[10:13]
bfOffBits = ;
// offset[14:17]
biSize = ;
// offset[18:21]
biWidth = width;
// offset[22:25]
biHeight = height;
// offset[26:27]
biPlanes = ;
// offset[28:29]
biBitCount = ;
// offset[30:33]
biCompression = ;
// offset[34:37]
biSizeImage = width * height * ;
// offset[38:41]
biXPelsPerMeter = ;
// offset[42:45]
biYPelsPerMeter = ;
// offset[46:49]
biClrUsed = ;
// offset[50:53]
biClrImportant = ; fp = fopen(name, "wb+");
if( fp == NULL )
{
printf("create file err, fopen: %p\n", fp);
return -;
} pData = (unsigned char *)malloc(biWidth*biHeight*+);//malloc(iFileSize);
if(pData == NULL)
{
printf("pData malloc err\n");
return -;
} // same as BM in ASCII.
pData[] = bfType1;
pData[] = bfType2; // the size of the BMP file in bytes. bmp文件的实际大小
pData[] = (unsigned char)((bfSize>>) & 0xff);
pData[] = (unsigned char)((bfSize>>) & 0xff);
pData[] = (unsigned char)((bfSize>>) & 0xff);
pData[] = (unsigned char)((bfSize>>) & 0xff); // reserved
pData[] = (unsigned char)((bfReserved1>>) & 0xff);
pData[] = (unsigned char)((bfReserved1>>) & 0xff);
// reserved
pData[] = (unsigned char)((bfReserved2>>) & 0xff);
pData[] = (unsigned char)((bfReserved2>>) & 0xff); // the offset, i.e. starting address, of the byte where the bitmap image data (Pixel Array) can be found.
// 颜色数据的偏移地址,实际为:54 = 14 + 40
pData[] = (unsigned char)((bfOffBits>>) & 0xff);
pData[] = (unsigned char)((bfOffBits>>) & 0xff);
pData[] = (unsigned char)((bfOffBits>>) & 0xff);
pData[] = (unsigned char)((bfOffBits>>) & 0xff); // the size of this header (40 bytes)
pData[] = (unsigned char)((biSize>>) & 0xff);
pData[] = (unsigned char)((biSize>>) & 0xff);
pData[] = (unsigned char)((biSize>>) & 0xff);
pData[] = (unsigned char)((biSize>>) & 0xff); // the bitmap width in pixels (signed integer).
pData[] = (unsigned char)((biWidth>>) & 0xff);
pData[] = (unsigned char)((biWidth>>) & 0xff);
pData[] = (unsigned char)((biWidth>>) & 0xff);
pData[] = (unsigned char)((biWidth>>) & 0xff); // the bitmap height in pixels (signed integer).
pData[] = (unsigned char)((biHeight>>) & 0xff);
pData[] = (unsigned char)((biHeight>>) & 0xff);
pData[] = (unsigned char)((biHeight>>) & 0xff);
pData[] = (unsigned char)((biHeight>>) & 0xff); // the number of color planes being used. Must be set to 1.
pData[] = (unsigned char)((biPlanes>>) & 0xff);
pData[] = (unsigned char)((biPlanes>>) & 0xff); // the number of bits per pixel, which is the color depth of the image. Typical values are 1, 4, 8, 16, 24 and 32.
pData[] = (unsigned char)((biBitCount>>) & 0xff);
pData[] = (unsigned char)((biBitCount>>) & 0xff); // the compression method being used. See the next table for a list of possible values.
pData[] = (unsigned char)((biCompression>>) & 0xff);
pData[] = (unsigned char)((biCompression>>) & 0xff);
pData[] = (unsigned char)((biCompression>>) & 0xff);
pData[] = (unsigned char)((biCompression>>) & 0xff); // the image size. This is the size of the raw bitmap data, and should not be confused with the file size.
pData[] = (unsigned char)((biSizeImage>>) & 0xff);
pData[] = (unsigned char)((biSizeImage>>) & 0xff);
pData[] = (unsigned char)((biSizeImage>>) & 0xff);
pData[] = (unsigned char)((biSizeImage>>) & 0xff); // the horizontal resolution of the image. (pixel per meter, signed integer)
pData[] = (unsigned char)((biXPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biXPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biXPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biXPelsPerMeter>>) & 0xff); // the vertical resolution of the image. (pixel per meter, signed integer)
pData[] = (unsigned char)((biYPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biYPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biYPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biYPelsPerMeter>>) & 0xff); // the number of colors in the color palette, or 0 to default to 2^n.
pData[] = (unsigned char)((biClrUsed>>) & 0xff);
pData[] = (unsigned char)((biClrUsed>>) & 0xff);
pData[] = (unsigned char)((biClrUsed>>) & 0xff);
pData[] = (unsigned char)((biClrUsed>>) & 0xff); // the number of important colors used, or 0 when every color is important; generally ignored.
pData[] = (unsigned char)((biClrImportant>>) & 0xff);
pData[] = (unsigned char)((biClrImportant>>) & 0xff);
pData[] = (unsigned char)((biClrImportant>>) & 0xff);
pData[] = (unsigned char)((biClrImportant>>) & 0xff); pp = &pData[];
for(i = ; i < biHeight; i++)
{
for(j = ; j < biWidth; j++)
{
set_color(pp, biWidth, biHeight, i, j, i+j, i, j); // 随便填有点颜色
}
} iFileSize = fwrite(pData, , bfSize, fp);
printf("generate file iFileSize: %d\n", iFileSize); free(pData); fclose(fp); return ;
}
以上生成的BMP,坐标起始位置(0,0)为左下角,填充颜色:
void set_color( unsigned char *pp, int w, int h,
int x, int y, unsigned char r, unsigned char g, unsigned char b )
{
pp[y*w*+x*+] = (unsigned char)r;
pp[y*w*+x*+] = (unsigned char)g;
pp[y*w*+x*+] = (unsigned char)b;
}
生成一个,~~~~(>_<)~~~~:
int main(int argc, char *argv[])
{
int ret;
char *file_name; if( argc != )
{
printf("please input bitmap file_name\n");
printf("usage: %s bitmap_file_name\n", argv[]);
return ;
} file_name = argv[]; ret = bitmap_file_generate(file_name, *, *); printf("bitmap_file_generate, ret: %d\n", ret); return ;
}