|
我创建的是16位的显示模式,代码如下:
BOOL SaveSurfacetoBitmap(LPDIRECTDRAWSURFACE7 lpdds,char * pszFileName)
{
BYTE* lpBuffer; // 表面指针
int nPitch; // 表面跨距
int nWidth, nHeight; // 表面宽高
int nImage;
FILE* fp;
if( (fp=fopen(pszFileName, "wb")) != NULL )
{
// 锁定表面
DDSURFACEDESC2 ddsd;
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
HRESULT hr = lpdds->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL );
if( hr == DD_OK )
{
lpBuffer = (BYTE *)ddsd.lpSurface;
nWidth = ddsd.dwWidth;
nHeight = ddsd.dwHeight;
nPitch = ((nWidth*16 + 31)>>5)<<2;
nImage = nPitch*nHeight;
}
// 保存文件头
BITMAPFILEHEADER FileHeader;
FileHeader.bfType = 'BM';
FileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
FileHeader.bfReserved1 = 0;
FileHeader.bfReserved2 = 0;
// 保存文件信息
BITMAPINFOHEADER Header;
Header.biSize = sizeof(BITMAPINFOHEADER); // 结构的大小
Header.biWidth = nWidth; // 宽
Header.biHeight = nHeight; // 高
Header.biPlanes = 1; // 固定
Header.biBitCount = 16; // 颜色数
Header.biCompression = BI_RGB; // 是否压缩
Header.biSizeImage = nImage; // 图片的大小
Header.biXPelsPerMeter = 0;
Header.biYPelsPerMeter = 0;
Header.biClrUsed = 0;
Header.biClrImportant = 0;
FileHeader.bfSize = nImage + FileHeader.bfOffBits;
fwrite(&FileHeader,1, sizeof(BITMAPFILEHEADER),fp);
fwrite(&Header,1,sizeof(BITMAPINFOHEADER),fp);
const BYTE * pImage = lpBuffer + (nHeight-1)*nPitch;
for(int j=0; j<nHeight; ++j)
{
fwrite(pImage,1,nPitch,fp);
pImage -= nPitch;
}
fclose(fp);
hr = lpdds->Unlock( NULL );
return true;
}
return false;
}
不知道是哪里出现了问题,我用经典的那个保存代码也不行,保存后的图片大小是对,就是不出图像,哪位高手指点一下? 在线等...... [em24] |
|