19,468
社区成员
发帖
与我相关
我的任务
分享
#define BMP_SAVE_TPYE_24 24
#define BMP_SAVE_TPYE_8 8
BOOL SaveToFile(LPCTSTR lpFileName, DWORD dwSaveType/* = BMP_SAVE_TPYE_24*/)
{
CFile file;
BITMAPFILEHEADER bh;
BITMAPINFOHEADER bi;
DWORD dwSize = m_nHeight * m_nWidth * 4, dwNewSize, dwi;
DWORD dwRowOffset = (m_nWidth * 3 + 3) / 4 * 4 - m_nWidth * 3;
BYTE *pData = new BYTE[dwSize];
if (pData == NULL)
{
goto Err;
}
DWORD dwOffset = 0;
dwNewSize = m_pBitmap->GetBitmapBits(dwSize, pData);
if (dwNewSize == 0)
{
goto Err;
}
DWORD dwPixCount = 1;
DWORD dwPaletteSize;
RGBQUAD rgb[256];
if (dwSaveType == BMP_SAVE_TPYE_8)
{
int quadOffset = 50;
int x, y, z;
BYTE B = 0, G = 0, R = 0;
dwi = 0;
for (x = 0; x < 6; x ++)
{
for (y = 0; y < 6; y ++)
{
for (z = 0; z < 6; z ++)
{
rgb[dwi].rgbRed = R;
rgb[dwi].rgbGreen = G;
rgb[dwi++].rgbBlue = B;
B += quadOffset;
}
B = 0;
G += quadOffset;
}
G = 0;
R += quadOffset;
}
for (dwi = 0; dwi < dwNewSize; dwi ++)
{
BYTE B = (pData[dwi++] / quadOffset) * quadOffset;
BYTE G = (pData[dwi++] / quadOffset) * quadOffset;
BYTE R = (pData[dwi++] / quadOffset) * quadOffset;
BOOL fFind = FALSE;
for (x = 0; x < 256; x ++)
{
if (rgb[x].rgbRed == R &&
rgb[x].rgbGreen == G &&
rgb[x].rgbBlue == B)
{
fFind = TRUE;
pData[dwOffset++] = x;
break;
}
}
if (fFind == FALSE)
{
pData[dwOffset++] = 255;
}
if (dwPixCount % m_nWidth == 0)
{
dwOffset += dwRowOffset;
}
dwPixCount ++;
}
dwPaletteSize = 1024;
}
else if (dwSaveType == BMP_SAVE_TPYE_24)
{
for (dwi = 0; dwi < dwNewSize; dwi ++)
{
pData[dwOffset++] = pData[dwi++];
pData[dwOffset++] = pData[dwi++];
pData[dwOffset++] = pData[dwi++];
if (dwPixCount % m_nWidth == 0)
{
dwOffset += dwRowOffset;
}
dwPixCount ++;
}
dwPaletteSize = 0;
}
else
{
goto Err;
}
dwSize = dwOffset;
bh.bfType = 0x4D42;
bh.bfReserved1 = 0;
bh.bfReserved2 = 0;
bh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwSize;
bh.bfOffBits = bh.bfSize - dwSize;
bi.biSize = 40;
bi.biWidth = m_nWidth;
bi.biHeight = -m_nHeight;
bi.biPlanes = 1;
bi.biCompression = BI_RGB;
bi.biClrImportant = 0;
bi.biClrUsed = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biSizeImage = dwSize;
bi.biBitCount = dwSaveType;
try
{
if (file.Open(lpFileName, CFile::modeCreate | CFile::modeReadWrite))
{
file.Write(&bh, sizeof(BITMAPFILEHEADER));
file.Write(&bi, sizeof(BITMAPINFOHEADER));
if (dwSaveType == BMP_SAVE_TPYE_8)
{
file.Write(&rgb[0], 1024);
}
file.Write(pData, dwSize);
file.Close();
delete [] pData;
return TRUE;
}
}
catch (CException* e)
{
e->Delete();
file.Close();
}
Err:
if (pData != NULL)
{
delete [] pData;
}
return FALSE;
}