几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量

几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 (http://www.dimcax.com/hust/index.php)
-   OpenGL图形显示 (http://www.dimcax.com/hust/forumdisplay.php?f=125)
-   -   【转帖】请教:自定义位图类怎样保存成bmp文件 (http://www.dimcax.com/hust/showthread.php?t=917)

yogy 2007-06-05 06:10 PM

【转帖】请教:自定义位图类怎样保存成bmp文件
 
我用COLORREFP定义成一维数组,从bmp中读取颜色值,修改后,请问将其如何保存到文件中去?
---------------------------------------------------------------

http://www.vckbase.com/code/listcod...id=7&sclsid=705
---------------------------------------------------------------

SaveFile(HDC hdc, HBITMAP hBitmap, CString strFileName)
{
HDC hDC;
int iBits;
WORD wBitCount;
DWORD dwPaletteSize=0;
DWORD dwBmBitsSize, dwDIBSize, dwWritten;
BITMAP Bitmap;
BITMAPFILEHEADER bmfHdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE hFile, hDib, hPal,hOldPal=NULL;
try
{
int ilength = strFileName.Find(":\\");
ilength = strFileName.Find("\\",ilength+2);
while(ilength !=-1)
{
CString strDirectory =strFileName.Left(ilength);
CFileFind FileFind;
if(!FileFind.FindFile(strDirectory,0))
if(!CreateDirectory(strDirectory,NULL))
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("フォルダクリエートに失敗しました。", NULL, MB_OK + MB_ICONSTOP + MB_SYSTEMMODAL);
}
else
return FALSE;
ilength = strFileName.Find("\\",ilength+1);
}
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;
else if (iBits <= 32)
wBitCount = 32;
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)* 4*Bitmap.bmHeight ;
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
hPal = GetStockObject(DEFAULT_PALETTE);
// CClientDC dc(this);

GetDIBits(hdc, hBitmap, 0, (UINT) Bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize,(BITMAPINFO *)lpbi, DIB_RGB_COLORS);

hFile = CreateFile(strFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL
| FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return FALSE;

bmfHdr.bfType = 0x4D42;
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwPaletteSize
+ dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)
+dwPaletteSize;
WriteFile(hFile, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile(hFile, (LPSTR)lpbi, dwDIBSize,&dwWritten, NULL);
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(hFile);
}
catch(...)
{
return FALSE;
}
return TRUE;
}


所有的时间均为北京时间。 现在的时间是 09:05 PM.