|
|
这是我在圣剑源码里看到的一段生成BMP文件的函数
bool SaveToBitmapFile(LPDIRECTDRAWSURFACE7 lpSurface, char* filename)
{
WORD* lpBuffer; // 表面指针
int nPitch; // 表面跨距
int nWidth=0, nHeight=0; // 表面宽高
// 打开文件
FILE* fp;
if( (fp=fopen(filename, "wb")) != NULL )
{
// 锁定表面
DDSURFACEDESC2 ddsd;
ddsd.dwSize = sizeof(ddsd);
//ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
HRESULT ddrval = lpSurface->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL );
if( ddrval == DD_OK )
{
lpBuffer = (WORD *)ddsd.lpSurface;
nWidth = ddsd.dwWidth;
nHeight = ddsd.dwHeight;
//lPitch以Byte为单位计数的,GraphPitch以WORD为单位。所以GraphPitch = lPitch / 2;
nPitch = ddsd.lPitch >> 1;
}
// 保存文件头
BITMAPFILEHEADER FileHeader;
FileHeader.bfType = 'BM'; //把这里得BM改成MB便可以了,这是为什么呢
FileHeader.bfSize = nWidth * nHeight * 3 + 0x36;
FileHeader.bfReserved1 = 0;
FileHeader.bfReserved2 = 0;
FileHeader.bfOffBits = 0x36;
fwrite(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp);
// 保存文件信息
BITMAPINFOHEADER Header;
Header.biSize = sizeof(BITMAPINFOHEADER); // 结构的大小
Header.biWidth = nWidth; // 宽
Header.biHeight = nHeight; // 高
Header.biPlanes = 1; // 固定
Header.biBitCount = 24; // 颜色数
Header.biCompression = BI_RGB; // 是否压缩
Header.biSizeImage = nWidth * nHeight * 3; // 图片的大小
Header.biXPelsPerMeter = 0;
Header.biYPelsPerMeter = 0;
Header.biClrUsed = 0;
Header.biClrImportant = 0;
fwrite(&Header, Header.biSize, 1, fp);
fseek(fp,-(int)(nWidth*nHeight*3),SEEK_END);
PutDebugNumber((int)(nWidth*nHeight*3));
WORD word;
lpBuffer += nWidth * (nHeight - 1);
char c='a';
for(int i=0; i<nHeight; i++)
{
for(int j=0; j<nWidth; j++)
{
word = *lpBuffer;
fputc( GetBlue( word ), fp); // 蓝
fputc( GetGreen( word ), fp); // 绿
fputc( GetRed( word ), fp); // 红
lpBuffer++;
}
lpBuffer -= nPitch*2; // 指针转到上一行的开始
}
fclose(fp);
// 解锁表面
ddrval = lpSurface->Unlock( NULL );
return true;
}
return false;
}
原函数的的FileHeader.bfType 值为 'BM'
但我使用这个函数生成的图片无法浏览,我用记事本打开生成的文件发现,左上角的值是"MB",可我明明附得是BM啊!无奈之下,我把FileHeader.bfType的值改成MB,再使用该函数,这次生成的图片是可以浏览的。打开生成的图片,左上角的值是BM。为什么会保存成相反的值呢?FileHeader.bfType的值应该设成多少呢? |
|