bmp文件格式的约定在百度百科里说的很详细
不过截止到我发帖为止,它里面的示例程序是错的,除非你的图像文件的每一行占用的字节数是4的倍数!
还有一个错误的地方是:bmp的颜色表每一个占用3字节,分别为r,g,b三种颜色,没有第四个保留字节。
下面的程序会在你的桌面上创建一个bmp的图像文件,可以直接打开,它是400*400像素的,只有一种颜色,而且为了缩短代码,以便更容易看清本质,我特意让它的每一行能让4整除(否则剩余的要用0补充),因为我们看到,一个像素3字节,一行400像素,所以一行1200字节,恰好能被4整除,省去了很多计算和代码。
#include <cstdio>
#include <windows.h>
BITMAPINFOHEADER info;
BITMAPFILEHEADER file;
RGBTRIPLE img;
FILE *p;
int main(){
p=fopen("C:\\Users\\Administrator\\Desktop\\qui.bmp","wb");
file.bfType=19778;
file.bfSize=480054;
file.bfOffBits=54;
info.biSize=40;
info.biWidth=400;
info.biHeight=400;
info.biPlanes=1;
info.biBitCount=24;
info.biCompression=0;
info.biSizeImage=480000;
img.rgbtRed=0xff;
img.rgbtBlue=0x77;
fwrite(&file,sizeof(file),1,p);
fwrite(&info,sizeof(info),1,p);
for(int i=0;i<info.biHeight;i++)
for(int j=0;j<info.biWidth;j++)
fwrite(&img,sizeof(img),1,p);
return 0;
}
其中 BITMAPINFOHEADER 的结构为
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER,*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;
BITMAPFILEHEADER 的结构为
</pre><pre name="code" class="cpp">typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER,*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;
RGBTRIPLE 的结构为
typedef struct tagRGBTRIPLE {
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} RGBTRIPLE,*LPRGBTRIPLE;
这些都在<wingdi.h>中定义了,且<windows.h>中又包含了这个库,所以直接用了<windows.h>。