bmp文件格式的约定在百度百科里说的很详细
不过截止到我发帖为止,它里面的示例程序是错的,除非你的图像文件的每一行占用的字节数是4的倍数!
还有一个错误的地方是:bmp的颜色表每一个占用3字节,分别为r,g,b三种颜色,没有第四个保留字节。
下面的程序会在你的桌面上创建一个bmp的图像文件,可以直接打开,它是400*400像素的,只有一种颜色,而且为了缩短代码,以便更容易看清本质,我特意让它的每一行能让4整除(否则剩余的要用0补充),因为我们看到,一个像素3字节,一行400像素,所以一行1200字节,恰好能被4整除,省去了很多计算和代码。
#include
#include
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
for(int j=0;j
fwrite(&img,sizeof(img),1,p);
return 0;
}其中 BITMAPINFOHEADER 的结构为
typedef struct tagBITMAPINFOHEADER{
DWORDbiSize;
LONGbiWidth;
LONGbiHeight;
WORDbiPlanes;
WORDbiBitCount;
DWORDbiCompression;
DWORDbiSizeImage;
LONGbiXPelsPerMeter;
LONGbiYPelsPerMeter;
DWORDbiClrUsed;
DWORDbiClrImportant;
} BITMAPINFOHEADER,*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;
BITMAPFILEHEADER 的结构为
typedef struct tagBITMAPFILEHEADER {
WORDbfType;
DWORDbfSize;
WORDbfReserved1;
WORDbfReserved2;
DWORDbfOffBits;
} BITMAPFILEHEADER,*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;RGBTRIPLE 的结构为
typedef struct tagRGBTRIPLE {
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} RGBTRIPLE,*LPRGBTRIPLE; 这些都在中定义了,且中又包含了这个库,所以直接用了。