2: Write buffer to an BMP file
{
int iHeight = 2560;
int iWidth = 2480;
int nRet = 0;
CFile file;
if(!file.Open(TEXT("c:\\tp_test.bmp"),CFile::modeCreate|CFile::modeWrite))
{
file.Close();
return SPID_ERROR_FILE_CREATE;
}
BITMAPFILEHEADER bmpFileHdr;
BITMAPINFOHEADER bmpInfoHdr;
::FillMemory(&bmpFileHdr,sizeof(BITMAPFILEHEADER),0);
::FillMemory(&bmpInfoHdr,sizeof(BITMAPINFOHEADER),0);
bmpFileHdr.bfType = 19778;
bmpFileHdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);
bmpFileHdr.bfSize = iWidth * iHeight + bmpFileHdr.bfOffBits;
bmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER);
bmpInfoHdr.biWidth = iWidth;
bmpInfoHdr.biHeight = iHeight;
bmpInfoHdr.biPlanes = 1;
bmpInfoHdr.biBitCount = 8;
bmpInfoHdr.biCompression = BI_RGB;
bmpInfoHdr.biXPelsPerMeter = (LONG)(theApp.imgResolution * 10000 / 254);
bmpInfoHdr.biYPelsPerMeter = (LONG)(theApp.imgResolution * 10000 / 254);
bmpInfoHdr.biSizeImage = iWidth * iHeight;
file.Write(&bmpFileHdr, sizeof(BITMAPFILEHEADER));//file header
file.Write(&bmpInfoHdr, sizeof(BITMAPINFOHEADER));//bm info hdr
//generate pallete
BYTE pal[256*sizeof(RGBQUAD)];
for (int i = 0; i < 256; i++)
{
pal[i*4+0] = pal[i*4+1] = pal[i*4+2] = i;
pal[i*4+3] = 0;
}
file.Write(pal, 256*sizeof(RGBQUAD));//pallete
// Write image
//BYTE* ptr = (BYTE*)image.Buffer;
for( int y = 0; y < iHeight; y++ )
{
file.Write( lpBits + (iHeight-1-y)*iWidth, iWidth );
}
file.Close();
}
浙公网安备 33010602011771号